2011-09-28 13 views
8

Intenté usar mi ApplicationContext y mi llamada Service's Context para acceder al directorio externo. Desafortunadamente, sigue respondiendo null, y LogCat informa que no pudo crear el directorio externo. Estoy seguro de que tengo el WRITE_STORAGE_PERMISSION presente, pero todavía no funcionará. Mi dispositivo está ejecutando API 10 (2.3.3) vanilla android. ¿Algunas ideas?No se puede crear archivos externos Dir en Android. WRITE_EXTERNAL_STORAGE está presente

Aquí es mi manifiesto:

<?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> 

y aquí es donde el código meta la pata:

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; 
    } 
} 

El código es un método de una Runnable, que es llamado por un Service. El constructor del Runnable toma un Context como su parámetro. Esa es la Context utilizada por el código. El código arroja una excepción en la llamada de Registro que sucede a, lo que implica que el almacenamiento externo está presente y disponible.

ACTUALIZACIONES DE CORRECCIÓN DE INTENTOS:

una instalación limpia no funciona.
Revertir a API 9 no funciona, aunque funcionó antes.

+0

Publique su archivo androidmanifest.xml. – Otra

+0

Publica tu código y cualquier rastro de pila relevante. sin eso, todo lo que podemos hacer es adivinar tiros en la oscuridad. – FoamyGuy

+0

¿Qué estás tratando de hacer? ¿Por qué llamas a context.getExternalFilesDir (null)? Cuéntanos el propósito y podemos apuntar mejor. Además, el seguimiento de la pila de tu logcat sería útil. – IncrediApp

Respuesta

9

CORREGIDO, pero realmente no sé por qué funciona ahora. Reinicio el dispositivo, y de repente, volvería a funcionar; Context#getExternalFilesDir() dejó de devolver null. Aunque funciona ahora (gracias y accesorios para The IT Crowd's Roy and Moss), ¿debería informar esto a Google o algo?

+3

Esto funciona pero vuelve algunas veces después de borrar los datos de mi aplicación. – offex

2

Debe tener el permiso WRITE_EXTERNAL_STORAGE en su AndroidManifest.xml. Al menos, eso fue lo que me solucionó.

Agregue la línea <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> antes de su línea <application ....

+0

Me sorprende que haya 3 causas diferentes para esto. – likejiujitsu

+2

ya tiene este conjunto de permisos. – Vincent

+0

Eso es lo más extraño, moví los permisos antes de la línea de la aplicación y funciona ahora. Reinicié entremedio, pero ya lo hice muchas veces. Gracias. – John

6

Esto es un hilo viejo pero me encontré con el mismo problema y descubrí que la razón por la que estoy sorprendido no es más común. Yo estaba tratando de escribir en el almacenamiento externo mientras el dispositivo estaba conectado a un ordenador/Eclipse .. y que estaba recibiendo el siguiente error,

06-25 16: 16: 09,565: W/Application Context (4290): No se puede crear el directorio de archivos externos 06-25 16: 16: 09.565: W/System.err (4290): java.io.FileNotFoundException: /full_archive.zip: error abierto: EROFS (sistema de archivos de solo lectura) 06- 25 16: 16: 09.565: W/System.err (4290): en libcore.io.IoBridge.open (IoBridge.java:416) 06-25 16: 16: 09.565: W/System.err (4290): en java.io.FileOutputStream. (FileOutputStream.java:88) 06-25 16: 16: 09.565: W/System.err (4290): en java.io.FileOutputStream. (FileOutputStream.java:73) 06- 25 16: 16: 09.565: W /System.err(4290): en com.seine.trophy.database.DownloaderThread.run (DownloaderThread.java:79) 06-25 16: 16: 09.573: W/System.err (4290): Causado por: libcore .io.ErrnoException: error abierto: EROFS (sistema de archivos de solo lectura) 06-25 16: 16: 09.573: W/System.err (4290): en libcore.io.Posix.open (método nativo) 06- 25 16: 16: 09.573: W/System.err (4290): en libcore.io.BlockGuardOs.open (BlockGuardOs.java: 110) 06-25 16: 16: 09.573: W/System.err (4290): en libcore.io.IoBridge.open (IoBridge.java:400) 06-25 16: 16: 09.573: W/System.err (4290): ... 3 más

Esto es de la Guía del desarrollador ...

Precaución: el almacenamiento externo puede no estar disponible si el usuario monta el almacenamiento externo en un equipo ...

Simplemente separando el teléfono de mi computadora/IDE resolvió el problema para mí.

+1

Esta fue la respuesta que se me ocurrió también. No puedo creer que este no sea un problema más común y que no esté en *** big bold *** en algún lugar más accesible. – Gowiem

+0

@ToddPainton No entendí este problema. ¿Quizás no configuró las opciones de desarrollador en la configuración? Yo uso Android 4.04 API 15. samsung S2. – likejiujitsu

+0

Oh, no, eso fue establecido. Mi solución eventualmente? Unidad. No soporto la programación nativa de Android por más tiempo. Y como un plus añadido? Puedo compilar el mismo código para Apple. –

Cuestiones relacionadas