關于存儲位置
內部存儲(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