Android 10.0以上創建文件失敗,說找不到該文件

問題場景:

如果你的app下的build.gradle設置了compileSdkVersion 30,且targetSdkVersion 30。你測試手機剛好是Android 11的。如果文件根目錄還是Environment.getExternalStorageDirectory()就會創建失敗。

log錯誤提示:

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Starwberry/img/local_sendpic_temp.jpg: open failed: ENOENT (No such file or directory)

不用去看是否是讀寫權限問題,Android 11根本沒有這目錄了

解決方案:

方式一:把compileSdkVersion和targetSdkVersion降到29以下(我沒測,理論上可以)

方式二:加版本判斷獲取根目錄

public static String getSDPath(Context context) {
    File sdDir = null;
    boolean sdCardExist = Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED);// 判斷sd卡是否存在
    if (sdCardExist) {
        if (Build.VERSION.SDK_INT>=29){
            //Android10之後
            sdDir = context.getExternalFilesDir(null);
        }else {
            sdDir = Environment.getExternalStorageDirectory();// 獲取SD卡根目錄
        }
    } else {
        sdDir = Environment.getRootDirectory();// 獲取跟目錄
    }
    return sdDir.toString();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章