關(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ù)故河,并且訪(fǎng)問(wèn)這個(gè)文件夾不需要權(quán)限吱韭,外部應(yīng)用無(wú)法訪(fǎng)問(wèn)該文件夾,官方推薦的應(yīng)用在沙盒沒(méi)的存儲(chǔ)文件的地址為Context.getExternalFilesDir()下的文件夾
如果要訪(fǎng)問(wèn)系統(tǒng)媒體權(quán)限要使用MediaStore訪(fǎng)問(wèn)鱼的,訪(fǎng)問(wèn)系統(tǒng)下載文件 未做限制
當(dāng)targetSdk<=P并且設(shè)備是從P升級(jí)到Q的時(shí)候理盆,將開(kāi)啟兼容模式,不開(kāi)啟Q中的存儲(chǔ)權(quán)限變更凑阶;但是當(dāng)應(yīng)用重新安裝(更新)時(shí)猿规,不會(huì)重新開(kāi)啟兼容模式,存儲(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è)里沒(méi)有
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));
可以直接獲取picture的目錄并對(duì)其操作
適配思路:
判斷其類(lèi)型宙橱,是否需要展示在公共相冊(cè)姨俩,如果是在公共相冊(cè)那么刪除需要用戶(hù)的授權(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