2010-10-31 14 views
17

Al iniciar mi aplicación Android, necesito crear un directorio en la tarjeta sd, para un pequeño número de usuarios esto falla y no puedo entender el razón para ello ...mkdirs devuelve falso para el directorio en la tarjeta SD mientras el directorio principal es escribible

(que he encontrado problemas similares causados ​​por el permiso WRITE_EXTERNAL_STORAGE faltante, que está ahí y funciona para casi todos los usuarios, así que no creo que esto es motivo)

tengo simplifiqué la situación anterior para que sea más fácil de explicar, si se produce un error en la creación de un directorio, ejecuto un caso de prueba donde trato de crear un directorio .test en la tarjeta SD:

new File(Environment.getExternalStorageDirectory(), ".test").mkdir() -> false 
new File(Environment.getExternalStorageDirectory(), ".test").mkdirs() -> false 

propiedades de los archivos de los directorios relevantes:

/sdcard/.test (existe = false CanWrite = false CanRead = false CanExecute = err isDirectory = false isFile = false)

/sdcard (existe = true CanWrite = true CanRead = true CanExecute = err isDirectory = true isFile = false)

/(existe = true CanWrite = false CanRead = true CanExecute = err isDirectory = true isFile = false)

getExternalStorageState = montado

(retornos CanExecute yerran porque la prueba se ejecuta en SDK < 9)

sugerencias e ideas son bienvenidas ...

+1

¿Podría mostrar el código donde intenta crear el directorio? Por ejemplo, si tiene una '/ sdcard' cableada, ese podría ser su problema allí mismo. – CommonsWare

+0

@CommonsWare: estoy usando Environment.getExternalStorageDirectory() y pensando en cambiar a Context.getExternalFilesDir (null) una vez que resuelvo este problema ... Editaré mi publicación original con el código ... Thansk para la respuesta rápida ! – Danny

+0

Tenga en cuenta que 'getExternalFilesDir()' solo existe para Android 2.2 y está roto en esa versión. Me quedaré con su estrategia actual en el futuro previsible. – CommonsWare

Respuesta

15

Es común que cuando usted no tiene un permiso en tu manifiesto

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

En cuanto a mí, era lo único equivocado.

+5

Solo tengo este problema para una cantidad muy pequeña de usuarios y mi AndroidManifest.xml tiene el permiso WRITE_EXTERNAL_STORAGE dentro de la etiqueta de manifiesto, así que lamento decir que esta no es la razón. – Danny

2

Es posible que estos usuarios tengan una tarjeta SD que esté dañada y, por lo tanto, montada como de solo lectura. Si es posible, debe consultar con ellos para ver si algo más puede escribirle archivos. Dado que tienes el permiso WRITE_EXTERNAL_STORAGE, no deberías tener problemas para hacer modificaciones a la tarjeta SD (y los permisos de todo en la tarjeta SD son de lectura/escritura mundiales para dichas aplicaciones, de modo que nada puede interferir con los permisos de los archivos para causar problemas)

+0

No creo que sea esto, Yo uso http://developer.android.com/reference/android/os/Environment.html#getExternalStorageState() para verificar esto y da "montado", debería dar "mounted_ro" en su situación, creo ... Gracias, sin embargo ... – Danny

0

que experimentaron un problema similar cuando se utiliza mkdirs(), sin embargo debido a la ejecución del comando:

mkdir uno/dos

falla en Linux, a continuación, la API (http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html#mkdirs()) posteriormente no demasiado . ¿Supongo que esto significa que no hay forma de usar mkdirs en Android? Mi (probablemente bastante hacky) solución alternativa era crear cada directorio necesaria por separado:

String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); 
new File(extStorageDirectory + "/one/").mkdirs(); 
new File(extStorageDirectory + "/one/two/).mkdirs(); 
4

he tenido problemas tratando de crear directorios en la tarjeta SD también. Descubrí que lo que sucedía era que mi código funcionaría bien en algunos teléfonos, y también en el emulador. Sin embargo, otros teléfonos reportarían errores.

Creo que hay un problema con ciertos teléfonos, el Atrix y el Bionic son dos ejemplos.

Estos teléfonos al usar el código Environment.getExternalStorageDirectory() realmente devuelven/mnt/sdcard.

Sin embargo, en estos teléfonos la tarjeta SD es en realidad/mnt/sdcard-ext.

Por lo tanto, en algún lugar de la línea parece que algunos fabricantes han roto el código getExternalStorageDirectory, y de alguna manera está devolviendo una ubicación falsa.

Me lo pasé genial averiguando esto porque mi código funcionaba en muchos dispositivos diferentes, y aún algunos usuarios informaron que falló.

3

Tuve el mismo problema. El permiso fue establecido y también la ruta fue la predeterminada (/ mnt/sdcard) pero mi android fue montado como un dispositivo de almacenamiento externo para navegar rápidamente por la tarjeta SD. Sin embargo, esto interfiere con otras aplicaciones.

Me di cuenta de esto cuando se bucea en el adb shell:

$ cd /mnt 
$ cd sdcard 
cd: can't cd to sdcard 
$ ls -l 
d--------- system system   2011-12-07 01:59 sdcard 

después de desmontar la imagen que tengo:

$ ls -l     
drwxrwxr-x system sdcard_rw   2011-12-07 11:46 sdcard 

Como se puede ver, mientras que monta la tarjeta sd está en el sistema grupo de usuarios y no hay permisos en absoluto. Después de desmontar el grupo se cambia a sdcard_rw y se otorgan permisos para leer y escribir.

2

Sé que esta es una publicación anterior, pero creo que todavía puedo ofrecer una sugerencia. Si está ejecutando su aplicación mientras desarrolla (es decir, el teléfono está conectado a la PC a través de USB), entonces es posible que la tarjeta SD haya sido montada por la PC. Tienes que desmontarlo (puedes hacerlo desde el teléfono o desde la PC) para obtener permiso de escritura, esto requiere que se haya establecido en el manifiesto.

2

Pensé que estaba teniendo este problema al depurar una aplicación. Estaba fallando porque la tarjeta SD fue montada por la computadora host durante la depuración. Al desmontar de la computadora, la aplicación volvió a funcionar.

+0

Quizás estoy equivocado, pero técnicamente es la misma respuesta que la mía solo con menos palabras ...: | – yoshi

4

Mi problema es que estaba usando mkdir para crear una ruta de varios directorios y obtuve false cada vez. Una vez que usé mkdirs mi problema se resolvió

1

Me encontré con este problema cuando el enlace simbólico/almacenamiento/emulado/0 de alguna manera faltaba. Lo que hice fue usar la aplicación de la cámara para tomar una foto. Observé que los detalles de las imágenes indicaban que estaba dentro/storage/emulated/0, aunque ese directorio no existía desde el explorador de archivos. Luego reinicié el teléfono. Después de reiniciar el directorio apareció en el explorador de archivos.

0

Me encontré con este problema en un dispositivo virtual. Para mí, el problema era que no había definido ningún almacenamiento externo para el dispositivo virtual. Ojalá ayude a alguien.

6

Tuve un problema similar y pasé varias horas para darme cuenta de lo que está mal. No funcionó en Sumsung Mega, pero para otros teléfonos funcionó bien. Realmente tenía el permiso WRITE_EXTERNAL_STORAGE y getExternalStorageDirectory está montado y disponible. Pero aún así el directorio no fue creado. ¿Qué ayudó? ¡Acabo de reiniciar el divice! ¡Y ayudó! Es una pena que nadie haya aconsejado esto antes. Espero que esto ayude!

7

En primer lugar, técnicamente mkdirs() devolver falso no significa que falló, simplemente significaba que no hacía los directorios. Si los directorios ya existen, mkdirs() continuará devolviendo falso.

segundo lugar, en Android 6, no sólo lo que necesita:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

también necesita un poco de equivalente de:

ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 

Para obtener más información sobre la comprobación de permisos, consulte:
https://github.com/googlesamples/android-RuntimePermissions

+0

¿Y qué hacer en caso de que no se otorgue el permiso? ¿Cómo solicitarlo correctamente? –

Cuestiones relacionadas