Aperto fallito : EACCES ( Autorizzazione negata )

? user3613696 @ | Original: StackOverFlow
---

Sto avendo un problema molto strano con memorizzazione accesso su alcuni dispositivi . L'applicazione funziona sui miei dispositivi di prova ( Nexus 4 & amp ; 7, Samsung GS5 ) . Tutti i miei dispositivi con sistema operativo Android 4.4.2 . Ma ho ricevuto molte e-mail da parte degli utenti che dicono che l'applicazione non può scrivere sulla memoria ( né la memoria interna, né la scheda SD) . Dal file di log ricevuta da feedback degli utenti, posso vedere il problema è il seguente codice :

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

Getta eccezione alla linea fstream = new FileOutputStream ( nome, true); durante la creazione FileOutputStream .

Il registro stack è :

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

Nel AndroidManifest.xml ho le seguenti autorizzazioni dichiarato :

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

Ho confermato che gli utenti utilizzano privato la corretta app sulla scheda SD . E ciò che è più strano è che non riesce a scrivere nella memoria interna pure . Come può accadere se ho letto entrambi & amp ; permessi di scrittura ? Gli utenti dicono che non si connettono i loro dispositivi al PC in quel momento .

Update

Si scopre che io chiamo FileOutputStream aprire e chiudere troppo spesso, che getta il FileNotFoundException a un certo punto . Suona più come un problema di threading .

---

Top 5 Risposta

1Garret @

Mi sono imbattuto in un problema simile un po 'indietro .

Il tuo problema potrebbe essere in due aree diverse . E 'o come si sta creando il file da scrivere, o il metodo di scrittura potrebbe essere viziata in quanto è a seconda del telefono .

Se si scrive il file in una posizione specifica sulla scheda SD, provare a utilizzare le variabili d'ambiente . Essi dovrebbero sempre puntare a un percorso valido . Ecco un esempio per scrivere nella cartella download :

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

Se si scrive il file nella memoria interna dell'applicazione . Prova questo esempio :

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

Personalmente mi affido a librerie esterne per gestire lo streaming di file . Questo non mi ha ancora fallito .

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

Ho perso uno dei dati troppe volte su un comando di scrittura non riuscito, quindi mi baso le librerie on conosciuti e testati per il mio sollevamento di carichi pesanti IO .

Una nota più, se i file sono di grandi dimensioni, si consiglia inoltre di esaminare l'esecuzione del IO in background, o usare i callback .

2ninad.sonje @

Ho anche affrontato lo stesso problema . Dopo molto duro lavoro, ho trovato cosa non andava nel mio caso . Il dispositivo è stato collegato al computer tramite cavo USB . Ci sono tipi di connessioni USB, come Mass Storage, dispositivo multimediale ( MTP ), Camera ( PTP ) etc. Il mio tipo di connessione è stato - ' Mass Storage ', e questo stava causando i problemi . Quando ho cambiato il tipo di connessione, il problema è stato risolto .

Ricordate sempre durante l'accesso filesystem su dispositivo Android : -

NON COLLEGARE AS MASS STORAGE al computer / pc .