关于存储位置
内部存储(Internal Storage)
//路径:(data/data/packageName/cache)
getCacheDir()
//路径:(data/data/packageName/files)
getFilesDir()
外部存储(External Storage)
(1)公共文件(目录)
//路径:/storage/emulated/0(SD卡的根目录,Q及以上不支持使用)
Environment.getExternalStorageDirectory()
(2)私有文件(目录)
//路径:/storage/emulated/0/Android/data/packageName/files
getApplicationContext().getExternalFilesDir("") 比如图片getExternalFilesDir(Environment.DIRECTORY_PICTURES)
android系统可通过Environment.getExternalStorageDirectory()获取存储卡的路径,但是现在有很多手机内置有一个存储空间,同时还支持外置sd卡插入,这样通过Environment.getExternalStorageDirectory()方法获取到的就是内置存储卡的位置
public static final String[] STANDARD_DIRECTORIES = {
DIRECTORY_MUSIC,
DIRECTORY_PODCASTS,
DIRECTORY_RINGTONES,
DIRECTORY_ALARMS,
DIRECTORY_NOTIFICATIONS,
DIRECTORY_PICTURES,
DIRECTORY_MOVIES,
DIRECTORY_DOWNLOADS,
DIRECTORY_DCIM,
DIRECTORY_DOCUMENTS,
DIRECTORY_AUDIOBOOKS,
};
路径:/storage/emulated/0/Android/data/应用包名/cache
getApplicationContext().getExternalCacheDir() ;
扩展
1、清除缓存
会清除data/data/packageName/cache 和 /storage/emulated/0/Android/data/packageName/cache路径的数据。
2、清除数据
会清除data/data/packageName/ 和 /storage/emulated/0/Android/data/packageName/ 路径下的所有数据。
androidQ 权限存储变更
Android Q在外部存储设备中为每个应用提供一个“隔离存储沙盒”,即应用私有文件夹,里面存储该应用的私有数据,并且访问这个文件夹不需要权限,外部应用无法访问该文件夹,官方推荐的应用在沙盒没的存储文件的地址为Context.getExternalFilesDir()下的文件夹
如果要访问系统媒体权限要使用MediaStore访问,访问系统下载文件 未做限制
当targetSdk<=P并且设备是从P升级到Q的时候,将开启兼容模式,不开启Q中的存储权限变更;但是当应用重新安装(更新)时,不会重新开启兼容模式,存储权限变更将生效
获取bitmap
try {
ParcelFileDescriptor parcelFileDescriptor = mContext.getContentResolver().openFileDescriptor(mInputUri, "r");
//TODO
bitmap= BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options);
} catch (FileNotFoundException e) {
//TODO
}
获取InputStream
InputStream inputStream = null;
try {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
AssetFileDescriptor assetFileDescriptor = mContext.getContentResolver().openAssetFileDescriptor(inputUri,"r");
if(assetFileDescriptor != null){
inputStream = assetFileDescriptor.createInputStream();
}
// inputStream = mContext.getContentResolver().openInputStream(inputUri);
}else {
inputStream = mContext.getContentResolver().openInputStream(inputUri);
}
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator
如果保存了 但是相册里没有
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));
可以直接获取picture的目录并对其操作
适配思路:
判断其类型,是否需要展示在公共相册,如果是在公共相册那么删除需要用户的授权,如果只是作为app内部使用,比如一个暂时需要的文件(我们将对其修改删除的)使用私有文件目录。
如果之前有在menifest文件中添加android:requestLegacyExternalStorage="true",要记得删除
Android 10分区存储介绍及百度APP适配实践
Android Q版本适配
Android Q(10) 文件存储适配
Android Q私有目录与公共目录文件的交互(读取,复制,保存等)
【Android】安卓Q适配指南-相册
Demo.AvatarActivity