最佳答案
我有一个非常奇怪的问题存储访问一些设备。这个应用程序可以在我的测试设备上运行(Nexus4 & 7,Samsung GS5)。我所有的设备都运行安卓4.4。但是我收到了很多用户的电子邮件,他们说这个应用程序不能写入存储器(无论是内部存储器还是 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 卡上使用了正确的应用程序。更奇怪的是,它也不能写入内部存储。如果我同时拥有读写权限,怎么会发生这种情况?这些用户说,他们当时并没有将自己的设备连接到电脑上。
更新
事实证明,我调用 open 和 close FileOutputStream 的次数太频繁了,这会在某个时候抛出 FileNotFoundException。听起来更像是线程问题。