falha na abertura: EACCES (permissão negada)
Estou tendo um problema muito estranho com o acesso ao armazenamento em alguns dispositivos. O aplicativo funciona nos meus dispositivos de teste (Nexus 4 e 7, Samsung GS5). Todos os meus dispositivos executando o Android 4.4.2. Mas recebi muitos e-mails de usuários dizendo que o aplicativo não pode gravar no armazenamento (nem no armazenamento interno nem no cartão SD). No arquivo de log recebido dos comentários do usuário, vejo que o problema é o seguinte código:
try {
if (fStream == null) {
fStream = new FileOutputStream(filename, true);
}
fStream.write(data, 0, bytes);
return;
} catch (IOException ex) {
ex.printStackTrace();
}
Lança exceção na linha fStream = new FileOutputStream (filename, true); ao criar FileOutputStream.
O log da pilha é:
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
No AndroidManifest.xml, tenho as seguintes permissões declaradas:
<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"/>
Confirmei que os usuários estão usando o aplicativo correto do privado no cartão SD. E o mais estranho é que ele também não grava no armazenamento interno. Como isso pode acontecer se eu tiver permissões de leitura e gravação? Os usuários dizem que não estão conectando seus dispositivos ao PC naquele momento.
Atualizar
Acontece que eu estou chamando abrir e fechar FileOutputStream com muita freqüência, o que lança a FileNotFoundException em algum momento. Parece mais um problema de segmentação.