androidQ 關(guān)于存儲(chǔ)權(quán)限相冊(cè)圖片

關(guān)于存儲(chǔ)位置

內(nèi)部存儲(chǔ)(Internal Storage)

//路徑:(data/data/packageName/cache)
getCacheDir()

//路徑:(data/data/packageName/files)
getFilesDir()

外部存儲(chǔ)(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)可通過(guò)Environment.getExternalStorageDirectory()獲取存儲(chǔ)卡的路徑,但是現(xiàn)在有很多手機(jī)內(nèi)置有一個(gè)存儲(chǔ)空間,同時(shí)還支持外置sd卡插入,這樣通過(guò)Environment.getExternalStorageDirectory()方法獲取到的就是內(nèi)置存儲(chǔ)卡的位置

 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/應(yīng)用包名/cache
getApplicationContext().getExternalCacheDir() ;

擴(kuò)展

1、清除緩存
會(huì)清除data/data/packageName/cache 和 /storage/emulated/0/Android/data/packageName/cache路徑的數(shù)據(jù)。

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

androidQ 權(quán)限存儲(chǔ)變更

Android Q在外部存儲(chǔ)設(shè)備中為每個(gè)應(yīng)用提供一個(gè)“隔離存儲(chǔ)沙盒”,即應(yīng)用私有文件夾,里面存儲(chǔ)該應(yīng)用的私有數(shù)據(jù),并且訪問(wèn)這個(gè)文件夾不需要權(quán)限,外部應(yīng)用無(wú)法訪問(wèn)該文件夾,官方推薦的應(yīng)用在沙盒沒的存儲(chǔ)文件的地址為Context.getExternalFilesDir()下的文件夾
如果要訪問(wèn)系統(tǒng)媒體權(quán)限要使用MediaStore訪問(wèn),訪問(wèn)系統(tǒng)下載文件 未做限制
當(dāng)targetSdk<=P并且設(shè)備是從P升級(jí)到Q的時(shí)候,將開啟兼容模式,不開啟Q中的存儲(chǔ)權(quán)限變更;但是當(dāng)應(yīng)用重新安裝(更新)時(shí),不會(huì)重新開啟兼容模式,存儲(chǔ)權(quán)限變更將生效

獲取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 

如果保存了 但是相冊(cè)里沒有
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));
可以直接獲取picture的目錄并對(duì)其操作

適配思路:
判斷其類型,是否需要展示在公共相冊(cè),如果是在公共相冊(cè)那么刪除需要用戶的授權(quán),如果只是作為app內(nèi)部使用,比如一個(gè)暫時(shí)需要的文件(我們將對(duì)其修改刪除的)使用私有文件目錄。
如果之前有在menifest文件中添加android:requestLegacyExternalStorage="true",要記得刪除

Android 10分區(qū)存儲(chǔ)介紹及百度APP適配實(shí)踐
Android Q版本適配
Android Q(10) 文件存儲(chǔ)適配
Android Q私有目錄與公共目錄文件的交互(讀取,復(fù)制,保存等)
【Android】安卓Q適配指南-相冊(cè)
Demo.AvatarActivity

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

友情鏈接更多精彩內(nèi)容