打开失败:EACCES(权限被拒绝)?

时间:2018-10-14 08:52:53

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

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快捷方式。

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

2 个答案:

答案 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个,则第二个及后续位置位于可移动存储中,并且您具有对它们的完全读取/写入权限。