Falha na abertura : EACCES ( Permissão negada )

? user3613696 @ | Original: StackOverFlow
---

Estou tendo um problema muito estranho com o armazenamento de acesso em alguns dispositivos . O app funciona em meus dispositivos de teste ( Nexus 4 & amp; 7, Samsung GS5 ) . Todos os meus dispositivos rodando Android 4.4.2 . Mas recebi muitos e-mails de usuários dizendo que o aplicativo não pode escrever para o armazenamento ( nem o armazenamento interno nem o cartão SD) . A partir do arquivo de registro recebido de feedback do usuário, eu posso ver 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();
}

Ele joga a exceção na linha FStream = new FileOutputStream (filename, true); ao criar FileOutputStream .

O registro de 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 eu tenho as seguintes permissões declarou:

 <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"/> 

Eu já confirmou que os usuários estão usando privada do aplicativo correto no cartão SD. E o que é mais estranho é que ele não consegue escrever para o armazenamento interno também. Como isso pode acontecer se eu tenho tanto ler & amp; permissões de gravação ? Os usuários dizem que não estão conectando seus dispositivos para o PC na época.

Update

Acontece que eu estou chamando FileOutputStream abrem e fecham com muita freqüência, o que gera a FileNotFoundException em algum ponto. Soa mais como um problema de segmentação .

---

Top 5 Responder

1Garret @

Corri para um problema semelhante a um tempo atrás .

Seu problema pode ser em duas áreas diferentes. É tanto como você está criando o arquivo para gravar, ou o seu método de escrita pode ser falho na medida em que é o telefone dependente.

Se você estiver escrevendo o arquivo para um local específico no cartão SD, tente usar variáveis ​​de ambiente. Eles devem sempre apontar para um local válido. Aqui está um exemplo de escrever para a pasta de downloads :

java.io.File xmlFile = new java.io.File(Environment
    .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
     + "/Filename.xml");

Se você estiver escrevendo o arquivo para o armazenamento interno do aplicativo. Tente este exemplo :

java.io.File xmlFile = new java.io.File((getActivity()
   .getApplicationContext().getFileStreamPath("FileName.xml")
   .getPath()));

Pessoalmente eu confio em bibliotecas externas para lidar com o streaming para o arquivo. Este não me falhou ainda.

org.apache.commons.io.FileUtils.copyInputStreamToFile(is, file);

Eu perdi uma dados muitas vezes em um comando falhou gravação, então eu confiar em bibliotecas conhecidas e testadas para o meu trabalho pesado IO .

Só mais uma nota, se os arquivos são grandes, você também pode querer olhar para a execução do IO em segundo plano, ou usar callbacks.

2ninad.sonje @

Eu também enfrentou o mesmo problema. Depois de muito trabalho duro, eu encontrei o que estava errado no meu caso . Meu dispositivo foi conectado ao computador via cabo USB. Existem vários tipos de conexões USB como Mass Storage, Dispositivo de mídia (MTP), Câmara ( PTP) etc. O meu tipo de conexão foi - ' Mass Storage ", e isso estava causando os problemas. Quando eu mudei o tipo de conexão, o problema foi resolvido .

Lembre-se sempre ao acessar sistema de arquivos no dispositivo android: -

NÃO LIGUE AS MASS STORAGE para o computador / pc .