androidQ 关于存储权限相册图片

关于存储位置

内部存储(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

你可能感兴趣的:(androidQ 关于存储权限相册图片)