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/"
可以轻松避免这种情况,但这种方法并不可靠,因为并非所有制造商都会在根目录中放置sdcard快捷方式。
有办法可靠地解决这个问题吗?
答案 0 :(得分:0)
我遇到了同样的问题使用许可的位置错误。是的:
<manifest>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
<application>
...
<activity>
...
</activity>
</application>
</manifest>
答案 1 :(得分:0)
该行代码应该已经在SD卡的foo目录中创建了一个文件(已安装SD卡)。
在过去四年左右制造的任何设备上均未使用。在此之前,它也不可靠地工作,因为并不需要存在这样的环境变量并指向您可以使用的任何地方。
使用System.getenv(“ SECONDARY_STORAGE”)阅读可以正常工作
如果“读取”的意思是“从该未记录的,不受支持的环境变量指向的文件系统位置读取”,那么它仅适用于恰巧在该未记录的,不受支持的环境变量中发布了半有用值的越野车设备。
使用“ / sdcard /”很容易避免这种情况,但是这种方法并不可靠,因为并非所有制造商都会在根目录中放置sdcard快捷方式。
它也不指向SD卡。
有办法可靠地解决这个问题吗?
您无法写入removable storage上的任意位置。
可移动存储上最简单的写入位置是getExternalFilesDirs()
上的getExternalCacheDirs()
,getExternalMediaDirs()
和Context
方法提供的位置。如果这些返回的位置超过2个,则第二个及后续位置位于可移动存储中,并且您具有对它们的完全读取/写入权限。