Android 10 中即使在 Manifest 裏面申請了
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
存儲讀取權限,並且App動態獲得了權限,在通過絕對路徑打開文件時,也有可能出現 open failed: EACCES (Permission denied) 權限不足的錯誤。
這裏官方文檔的解釋是:以 Android 10(API 級別 29)及更高版本爲目標平臺的應用在默認情況下被賦予了對外部存儲設備的分區訪問權限(即分區存儲)。此類應用只能看到本應用專有的目錄(通過 Context.getExternalFilesDir() 訪問)以及特定類型的媒體。
這種分區存儲限制了應用通過絕對路徑去打開文件,不能通過File file = new File(filePath)
去打開,這類路徑不具有直接內核訪問權限。要訪問此類文件,應用必須使用 MediaStore,並調用 openFile() 等方法。
如果不得不從絕對路徑中打開文件,可以通過在 Manifest 的 application 標籤裏面加上
android:requestLegacyExternalStorage="true"
來使用舊版本的存儲規則。
Android文檔