前言
今天遇到個(gè)問題,在安卓10以下保存圖片到目錄有效仔沿,在安卓11上就不行坐桩。
有問題的代碼是這樣的
String path = Environment.getExternalStorageDirectory()+"/DirName/"+"123.jpg";
上面這句代碼獲取的是文件的根目錄。
最終的解決辦法是于未,把上述代碼換成下面這個(gè)代碼:
//下面這段代碼獲取的目錄是//storage/emulated/0/Android/data/com.microhabit/files/DirName/123.jpg
String path = MyApplication.context.getExternalFilesDir(null)+ "/DirName/"+"123.jpg"
原因:在安卓11版本官方不在允許第三方應(yīng)用在用戶文件夾內(nèi)隨意創(chuàng)建目錄和文件撕攒。(其實(shí)對于用戶來說這也是一件好事),所以在高版本上使用
Environment.getExternalStorageDirectory()
這句獲取外部目錄并創(chuàng)建文件夾就失效了烘浦。
需要注意的是抖坪,如果把文件放在 MyApplication.context.getExternalFilesDir(null)它獲取的目錄下,
當(dāng)應(yīng)用被卸載時(shí)闷叉,該目錄內(nèi)的文件會(huì)一起被刪除擦俐。
其他說明:解決上面的問題,我沒有使用FileProvider和在清單文件加入這兩句
android:requestLegacyExternalStorage="true"
android:preserveLegacyExternalStorage="true"
完成代碼片段:
/**
* 獲取頭像保存位置
* @return
*/
public static String getHeadPath(String user_id) {
String mFile = null;
if (mFile == null) {
//mFile = Environment.getExternalStorageDirectory()+ "/MicroHabit/"+user_id+".jpg";
//String path = Environment.getExternalStorageDirectory() + "/MicroHabit";
if(MyApplication.context==null){
return "";
}
String path = MyApplication.context.getExternalFilesDir(null) + "/MicroHabit";
mFile = MyApplication.context.getExternalFilesDir(null)+ "/MicroHabit/"+user_id+".jpg";
//storage/emulated/0/Android/data/com.microhabit/files/MicroHabit/111.jpg
File filePath = new File(path);
if (!filePath.exists()) {
filePath.mkdirs();
}
}
return mFile;
}
總結(jié):
在安卓11以上版本不能在自身應(yīng)用目錄以外的地方創(chuàng)建文件握侧。
通過fileprovide的方式好像可以獲得權(quán)限蚯瞧,目前還沒有在11版本上做嘗試。
————————————————
版權(quán)聲明:本文為CSDN博主「Granger_g」的原創(chuàng)文章品擎,遵循CC 4.0 BY-SA版權(quán)協(xié)議埋合,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/gaoqingliang521/article/details/123072175