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系統(tǒng)可通過Environment.getExternalStorageDirectory()獲取存儲卡的路徑,但是現(xiàn)在有很多手機內置有一個存儲空間,同時還支持外置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路徑的數(shù)據(jù)。

2、清除數(shù)據(jù)
會清除data/data/packageName/ 和 /storage/emulated/0/Android/data/packageName/ 路徑下的所有數(shù)據(jù)。

androidQ 權限存儲變更

Android Q在外部存儲設備中為每個應用提供一個“隔離存儲沙盒”,即應用私有文件夾,里面存儲該應用的私有數(shù)據(jù),并且訪問這個文件夾不需要權限,外部應用無法訪問該文件夾,官方推薦的應用在沙盒沒的存儲文件的地址為Context.getExternalFilesDir()下的文件夾
如果要訪問系統(tǒng)媒體權限要使用MediaStore訪問,訪問系統(tǒng)下載文件 未做限制
當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分區(qū)存儲介紹及百度APP適配實踐
Android Q版本適配
Android Q(10) 文件存儲適配
Android Q私有目錄與公共目錄文件的交互(讀取,復制,保存等)
【Android】安卓Q適配指南-相冊
Demo.AvatarActivity

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容