0
new File(System.getenv("SECONDARY_STORAGE") + "/foo/", "bar.txt").createNewFile()

那行代码应该已经在 sd 卡的目录 foo 中创建了一个文件(已安装 sd 卡)。然而System.getenv("SECONDARY_STORAGE")回报"/storage/sdcard1"。它应该可以正常工作,只是首先应该创建文件的代码会抛出

android.system.ErrnoException: open failed: EACCES (Permission denied)

注:一个子类IOException

阅读使用System.getenv("SECONDARY_STORAGE")工作正常,但是,所有的写作方式都会失败,但同样的例外。

这很容易通过使用来避免,"/sdcard/"但该方法不可靠,因为并非所有制造商都会在 root 中放置 sdcard 快捷方式。

有没有办法可靠地解决这个问题?

4

1 回答 1

0

那行代码应该已经在 sd 卡的目录 foo 中创建了一个文件(已安装 sd 卡)。

不是在过去四年左右制造的任何设备上。在此之前它也不能可靠地工作,因为不需要这样的环境变量存在并指向您可以使用的任何地方。

使用 System.getenv("SECONDARY_STORAGE") 读取工作正常

如果“读取”是指“从该未记录、不受支持的环境变量指向的文件系统位置读取”,那么它仅适用于碰巧在该未记录、不受支持的环境变量中发布半有用值的错误设备。

使用“/sdcard/”可以轻松避免这种情况,但该方法不可靠,因为并非所有制造商都会在 root 中放置 sdcard 快捷方式。

它也不指向 SD 卡。

有没有办法可靠地解决这个问题?

您无法写入可移动存储上的任意位置。

可移动存储上最简单的写入位置是由getExternalFilesDirs()getExternalCacheDirs()getExternalMediaDirs()方法提供的位置Context。如果它们返回 2+ 个位置,则第二个和后续位置位于可移动存储上,并且您对它们具有完全的读/写访问权限。

于 2018-10-14T11:01:38.887 回答