android - 打开失败 : EACCES (Permission denied)

标签 android filenotfoundexception

我在某些设备上访问存储时遇到了一个非常奇怪的问题。该应用程序适用于我的测试设备(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();
}

它在 fStream = new FileOutputStream(filename, true); 行抛出异常创建 FileOutputStream 时。

堆栈日志是:

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 卡上使用了正确的私有(private)应用。更奇怪的是它也无法写入内部存储。如果我同时具有读取和写入权限,怎么会发生这种情况?用户说他们当时没有将设备连接到 PC。

更新

事实证明,我过于频繁地调用 open 和 close FileOutputStream,这会在某些时候引发 FileNotFoundException。听起来更像是线程问题。

最佳答案

默认情况下,以 Android Q - API 29 为目标的应用程序会获得外部存储的过滤 View 。对此的快速解决方法是在 AndroidManifest.xml 中添加此代码:

<manifest ... >
    <!-- This attribute is "false" by default on apps targeting Android Q. -->
    <application android:requestLegacyExternalStorage="true" ... >
     ...
    </application>
</manifest>

在此处了解更多信息: https://developer.android.com/training/data-storage/compatibility

关于android - 打开失败 : EACCES (Permission denied),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23527767/

相关文章:

android - 有没有办法覆盖 WebView 的行为?

java - 将对象写入二进制文件时出错

java - 不允许使用文件未找到异常,但这是必要的

java - 当文件存在且具有所有权限时出现 FileNotFoundException

templates - 当模板客户端位于子目录中时出现 java.io.FileNotFoundException

android - 需要帮助理解 GLES 2.0 的 glDrawElements

Android:动画菜单图标

android - 引用库最近 SDK/Eclipse 更新异常

javascript - 菜单在 Android Chrome 上不起作用

java - Android:应用程序重新启动时下载的文件被删除