Android 10.0以上創(chuàng)建文件失敗,說找不到該文件

問題場景:

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

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)

不用去看是否是讀寫權(quán)限問題,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();
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 Android中經(jīng)常需要使用文件存儲用戶數(shù)據(jù) 本文將梳理各個版本中的文件存儲,希望能幫上忙。 1. 簡介 A...
    彭旭銳閱讀 6,704評論 11 81
  • 文章內(nèi)容轉(zhuǎn)載自Android 7.0 行為變更 通過FileProvider在應(yīng)用間共享文件吧 - CSDN博客 ...
    暴躁的西瓜閱讀 2,429評論 0 3
  • 寫在前面 雖然這個出來好久了,之前也一直沒有遇到什么問題,但是最近在不同app中共享的時候還是出了問題,現(xiàn)在引用鴻...
    dlihasa閱讀 9,770評論 0 13
  • 表情是什么,我認為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,501評論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 7,645評論 0 4

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