【发布时间】:2017-05-03 18:44:07
【问题描述】:
ContextCompat.getExternalFilesDirs(context, null) 说:
返回所有外部存储设备上应用程序特定目录的绝对路径,应用程序可以在其中放置其拥有的持久文件。
例如,运行 Android 5.1.1 的 Huawei Honor 从该方法返回以下内容:
/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,但似乎并非如此。
我也听到了来自其他设备的报告,包括更现代的三星设备。这只是 OEM 没有正确实现这一点,还是我在 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+ 上的那些位置无关。
-
糟糕。以上更新。第二个,是可移动的 sd 卡。
-
嗯,你应该有读/写权限。您可能会考虑发布失败的代码以及完整的堆栈跟踪。恕我直言,制造商更有可能搞砸可移动存储而不是外部存储。
-
添加了一些代码
标签: android storage android-sdcard