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