ContextCompat.getExternalFilesDirs(context, null)說:所有的外接存儲設備,其中應用程序可以將其擁有持久的文件爲什麼有些ContextCompat.getExternalFilesDirs無法訪問?
返回絕對路徑,特定於應用程序的目錄。
例如一個華爲Honor運行Android 5.1.1返回來自該方法執行以下操作:
/storage/emulated/0/Android/data/my.package.name/files
/storage/sdcard1/Android/data/my.package.name/files
第二目錄是可移動SD卡。但是,如果我試圖讀取或寫入該目錄,我會得到一個例外:android.system.ErrnoException: open failed: EACCES (Permission denied)
該應用程序確實有WRITE_EXTERNAL_STORAGE
。這在運行Android 4.4.4的三星Galaxy Note 4上運行得很好。這與Android 6.0的可選許可無關,因爲這是5.1.1上顯示的問題。
該API說the application can place persistent files it owns
但它似乎並非如此。
我也聽過其他設備的報告,包括更多的現代三星設備。這僅僅是原始設備製造商沒有正確實施,或者是有什麼我錯過了Android的複雜的存儲框架?
這是一些代碼,將在這個和一些設備上演示這一點。
File removable = ContextCompat.getExternalFilesDirs(context, null)[1];
if (removable.exists() && removable.canRead() && removable.canWrite()) {
File test = new File(removable, "test");
test.createNewFile(); // Throws the exception mentioned above
}
任何嘗試在該目錄中創建,移動mkdir文件都失敗。
「如果我試圖讀取或寫入到該目錄」 - 該目錄?你列出他們中的兩個。 「該應用程序確實有WRITE_EXTERNAL_STORAGE」 - 這與Android 4.4+上的這些位置無關。 – CommonsWare
糟糕。上面更新。第二個,這是一個可移動的SD卡。 – cottonBallPaws
那麼,你應該有讀/寫訪問權限。您可能會考慮發佈失敗的代碼以及完整的堆棧跟蹤。恕我直言,更有可能的是,製造商將可拆卸存儲裝置拆除而不是外部存儲裝置。 – CommonsWare