2011-09-28 11 views
8

Ho provato ad utilizzare sia il mio ApplicationContext sia il mio numero di telefono Service per accedere alla directory esterna. Context Sfortunatamente, continua a restituire null e LogCat segnala che non è stato in grado di creare la directory esterna. Sono sicuro di avere il WRITE_STORAGE_PERMISSION presente, ma ancora non funzionerà. Il mio dispositivo sta eseguendo l'API 10 (2.3.3) vanilla Android. Qualche idea?Impossibile creare file esterni Dir in Android. WRITE_EXTERNAL_STORAGE è presente

Ecco il mio manifesto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="droid.signboard" android:versionCode="1" 
android:versionName="1.0"> 
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> 


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 



<application android:icon="@drawable/icon" android:label="@string/app_name" 
    android:name="SignboardApp"> 
    <receiver android:name=".ApplicationStarter"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
      <action android:name="droid.signboard.LAUNCHER_START"></action> 
     </intent-filter> 
    </receiver> 
    <activity android:label="@string/app_name" 
     android:screenOrientation="landscape" android:launchMode="singleTop" 
     android:name=".view.Signboard"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"></action> 
      <category android:name="android.intent.category.LAUNCHER"></category> 
     </intent-filter> 
    </activity> 
    <service android:name=".controller.MasterControllerService"> 
     <intent-filter> 
      <action 
       android:name="droid.signboard.LAUNCH_SERVICE_FROM_ACTIVITY"></action> 
     </intent-filter> 
    </service> 


</application> 
</manifest> 

e qui è dove il codice scombina:

private boolean canWriteEx() { 

    String state = Environment.getExternalStorageState(); 

    if (state.equals (Environment.MEDIA_MOUNTED)) { 
     Log.i (TAG, "Can write to external directory: " 
       + context.getExternalFilesDir (null).getAbsolutePath()); 
     return true; 
    } else { 
     Log.i (TAG, "Cannot write to external directory: " 
       + context.getExternalFilesDir (null).getAbsolutePath()); 
     return false; 
    } 
} 

Il codice è un metodo di un Runnable, che si chiama da un Service. Il costruttore di Runnable prende come parametro un Context. Questo è il Context utilizzato dal codice. Il codice genera un'eccezione nella chiamata di registro che supera, implicando che lo spazio esterno è presente e disponibile.

AGGIORNAMENTI di correzioni tentato:

una installazione pulita non funziona.
Il riavvio all'API 9 non funziona, sebbene abbia funzionato prima.

+0

Pubblica il tuo file androidmanifest.xml. – Otra

+0

Pubblica il tuo codice e qualsiasi traccia dello stack pertinente. senza di essa tutto ciò che possiamo fare è indovinare i colpi nell'oscurità. – FoamyGuy

+0

Cosa stai cercando di fare? Perché stai chiamando context.getExternalFilesDir (null)? Diteci lo scopo e potremmo mirarvi meglio. Inoltre, lo stack trace dal tuo logcat sarebbe utile. – IncrediApp

risposta

9

FISSO, ma non so davvero perché funzioni ora. Riavvia il dispositivo, quindi all'improvviso funzionerebbe di nuovo; Context#getExternalFilesDir() smesso di restituire null. Anche se ora funziona (grazie e oggetti di scena a Roy e Moss The IT Crowd), dovrei segnalarlo a Google o qualcosa del genere?

+3

Funziona ma torna a volte dopo aver cancellato i dati della mia app. – offex

2

È necessario disporre dell'autorizzazione WRITE_EXTERNAL_STORAGE nel file AndroidManifest.xml. Almeno, questo è quello che ha risolto per me.

Aggiungere la riga <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> prima della riga <application ....

+0

Sono sorpreso che ci siano 3 diverse cause alla radice per questo. – likejiujitsu

+2

ha già questo set di autorizzazioni. – Vincent

+0

Questa è la cosa più strana, ho spostato le autorizzazioni _prima_ la riga dell'applicazione e ora funziona. Si è riavviato, ma lo ha già fatto molte volte. Grazie. – John

6

Questo è un thread vecchio, ma mi sono imbattuto nello stesso problema e ho trovato il motivo per cui sono sorpreso non è più comune. Stavo cercando di scrivere al di memorizzazione esterno, mentre il dispositivo è stato collegato al computer/Eclipse .. e mi è stato sempre il seguente errore,

06-25 16: 16: 09,565: W/ApplicationContext (4290): Impossibile creare la directory dei file esterni 06-25 16: 16: 09.565: W/System.err (4290): java.io.FileNotFoundException: /full_archive.zip: open non riuscito: EROFS (file system di sola lettura) 06- 25 16: 16: 09.565: W/System.err (4290): a libcore.io.IoBridge.open (IoBridge.java:416) 06-25 16: 16: 09.565: W/System.err (4290): a java.io.FileOutputStream. (FileOutputStream.java:88) 06-25 16: 16: 09.565: W/System.err (4290): a java.io.FileOutputStream. (FileOutputStream.java:73) 06- 25 16: 16: 09.565: W /System.err(4290): su com.seine.trophy.database.DownloaderThread.run (DownloaderThread.java:79) 06-25 16: 16: 09.573: W/System.err (4290): causato da: libcore .io.ErrnoException: open failed: EROFS (file system di sola lettura) 06-25 16: 16: 09.573: W/System.err (4290): a libcore.io.Posix.open (metodo nativo) 06- 25 16: 16: 09.573: W/System.err (4290): su libcore.io.BlockGuardOs.open (BlockGuardOs.java: 110) 06-25 16: 16: 09.573: W/System.err (4290): a libcore.io.IoBridge.open (IoBridge.java:400) 06-25 16: 16: 09.573: W/System.err (4290): ... 3 più

Questo è dalla Guida per gli sviluppatori ...

Attenzione: memorizzazione esterna può diventare non disponibile se l'utente monta la memorizzazione esterna su un computer ...

Basta scollegare il telefono dal mio computer/IDE risolto il problema per me.

+1

Questa è stata la risposta che mi è venuta in mente. Non riesco a credere che questo non sia un problema più comune e non sia in un *** in grassetto *** da qualche parte più accessibile. – Gowiem

+0

@ToddPainton Non ho avuto questo problema - forse non hai impostato le opzioni di sviluppo nelle impostazioni? Io uso Android 4.04 API 15. samsung S2. – likejiujitsu

+0

Oh no è stato impostato. La mia soluzione alla fine? Unità. Non sopporto più la programmazione nativa per Android. E come plus aggiunto? Posso compilare lo stesso codice per Apple. –

Problemi correlati