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

95

我在一些设备上遇到了非常奇怪的存储访问问题。该应用程序在我的测试设备(Nexus 4&7,三星GS5)上运行正常。我所有的设备都运行Android 4.4.2。但是我收到了很多用户的电子邮件,他们说该应用无法写入存储器(内部存储器和SD卡都不行)。从用户反馈接收的日志文件中,我可以看到问题出在以下代码:

try {
    if (fStream == null) {
    fStream = new FileOutputStream(filename, true);
}
    fStream.write(data, 0, bytes);
    return;
} catch (IOException ex) {
    ex.printStackTrace();
}

在创建FileOutputStream时,当执行语句fStream = new FileOutputStream(filename, true);时,抛出了异常。

堆栈日志如下:

W/System.err( 8147): Caused by: java.io.FileNotFoundException: /storage/emulated/0/my_folder/test_file_name.png: open failed: EACCES (Permission denied)
w/System.err( 8147):    at libcore.io.IoBridge.open(IoBridge.java:409)
W/System.err( 8147):    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err( 8147):    at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err( 8147):    at myapp.save(SourceFile:515)
W/System.err( 8147):    ... 8 more
W/System.err( 8147): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
W/System.err( 8147):    at libcore.io.Posix.open(Native Method)
W/System.err( 8147):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err( 8147):    at libcore.io.IoBridge.open(IoBridge.java:393)
W/System.err( 8147):    ... 11 more

在AndroidManifest.xml中,我声明了以下权限:

 <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19"/>
    <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

我已确认用户正在使用正确的应用程序的私有SD卡。更奇怪的是,即使在具有读取和写入权限的情况下,它也无法写入内部存储。如果我已经获得了读取和写入权限,那么这种情况怎么会发生呢?用户说他们当时没有将设备连接到PC。

更新

事实证明,我过于频繁地调用打开和关闭FileOutputStream,这个问题最终导致了FileNotFoundException。听起来更像是线程问题。


事实证明,我调用了太频繁的open和close FileOutputStream,这在某些时候会抛出FileNotFoundException异常。听起来更像是线程问题。 - user3613696
请查看我的答案,希望能对您有所帮助。https://dev59.com/HY_ea4cB1Zd3GeqPIgTz#58797938 - F_Z
getExternalStoragePublicDirectory(...) 已被弃用,请使用 this.getApplicationContext().getExternalFilesDir(null).toString(); 代替。 - Moonis Abidi
22个回答

-2
我解决了这个问题,通过使用另一种方法:
data/data/[packagename]/cache/...

1
你好 @CedarLi - 欢迎来到 Stack Overflow ... 你的回答解决了权限被拒绝还是原始问题(OP)?如果你认为你有一些对现有历史答案的补充见解,请编辑最相关的答案以包含你的新见解。 - Mr R

-3

在我的情况下,我忘记在文件名前面添加 / ,添加后我就把它去掉了。

bitmap.compress(Bitmap.CompressFormat.PNG,100,new FileOutputStream(Environment.getExternalStorageDirectory()+"/arjunreddy.png"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接