【问题标题】:Open failed: EACCES (Permission denied)?打开失败:EACCES(权限被拒绝)?
【发布时间】:2018-10-14 08:52:52
【问题描述】:
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 快捷方式。

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

【问题讨论】:

  • 您是否在清单中添加了写入外部存储的权限?
  • 仅供参考,我想要一个功能,可以将下载(应用程序功能)放在内部或 sd 卡中作为设置,我掉到了这里。
  • 是的@IntsabHaider,是的,我有。

标签: java android android-sdcard ioexception android-storage


【解决方案1】:

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

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

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

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

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

它也不指向 SD 卡。

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

您无法写入removable storage 上的任意位置。

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

【讨论】:

  • 这些确实有效,但是,有没有更好的方法可以轻松获取 sd 卡的根文件夹。我觉得我问的太多了,但是如果有人知道,请分享您的知识。现在,我将使用getExternalCacheDirs()[1].getParentFile().getParentFile().getParentFile()。谢谢@CommonsWare。
  • @iBlueDust:这不可靠,即使可靠,您也不应该能够读取或写入该位置。无法访问根文件夹,原因很简单,这样的文件夹对您来说毫无用处。 Google 希望您使用的是存储访问框架(例如,ACTION_OPEN_DOCUMENT_TREE),而不是直接使用任何文件系统。
猜你喜欢
  • 2017-07-10
  • 2012-09-07
  • 2020-11-29
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多