android - permisos - mkdirs devuelve false para el directorio en la tarjeta sd, mientras que el directorio principal es de escritura
manejo de archivos en android studio (12)
Al iniciar mi aplicación de Android, necesito crear un directorio en la tarjeta SD, para una pequeña cantidad de usuarios, esto falla y no puedo averiguar la razón para ello ...
(Encontré problemas similares causados por el permiso WRITE_EXTERNAL_STORAGE, está ahí y funciona para casi todos los usuarios, así que no creo que sea por eso)
He simplificado la situación anterior para facilitar la explicación, si la creación de un directoy falla, ejecuto un caso de prueba en el que intento crear un directorio .test en la sdcard:
new File(Environment.getExternalStorageDirectory(), ".test").mkdir() -> false
new File(Environment.getExternalStorageDirectory(), ".test").mkdirs() -> false
Propiedades de archivo 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 = verdadero canWrite = falso canRead = verdadero canExecute = err isDirectory = true isFile = falso)
getExternalStorageState = montado
(CanExecute devuelve un error porque la prueba se ejecuta en sdk <9)
Sugerencias e ideas son muy bienvenidas ...
En primer lugar, técnicamente mkdirs () devolviendo falso no significa que haya fallado, solo significa que no hizo los directorios. Si los directorios ya existen, mkdirs () continuará devolviendo falso.
En segundo lugar, en Android 6, no solo necesitas:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
También necesitas algún equivalente de:
ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
Para obtener más información sobre la verificación de permisos, consulte:
https://github.com/googlesamples/android-RuntimePermissions
Es común cuando no tienes un permiso en tu manifiesto.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
En cuanto a mí fue lo único malo.
Es posible que estos usuarios tengan una tarjeta SD dañada y, por lo tanto, montada de solo lectura. Si es posible, debe consultar con ellos para ver si algo más puede escribir archivos en él. Dado que tiene el permiso WRITE_EXTERNAL_STORAGE, no debería tener problemas para realizar modificaciones en la tarjeta SD (y los permisos de todo en la tarjeta SD son de lectura / escritura mundiales para tales aplicaciones, por lo que nada puede alterar los permisos de los archivos y causarles problemas. ).
Experimenté un problema similar al usar mkdirs (), pero al ejecutar el comando:
mkdir uno / dos
falla en Linux, luego la API ( http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html#mkdirs() ) también falla posteriormente. Supongo que esto significa que no hay forma de usar mkdirs en Android? Mi (probablemente un poco pirata) la solución fue crear cada directorio necesario por separado:
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
new File(extStorageDirectory + "/one/").mkdirs();
new File(extStorageDirectory + "/one/two/).mkdirs();
Me encontré con este problema cuando el enlace simbólico / almacenamiento / emulado / 0 faltaba de alguna manera. Lo que hice fue usar la aplicación de la cámara para tomar una foto. Observé que los detalles de las imágenes decían que estaba dentro de / 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.
Me encontré con este problema en el dispositivo virtual. Para mí, el problema era que no había definido ningún almacenamiento externo para el dispositivo virtual. Esperemos que ayude a alguien.
Mi problema fue que estaba usando mkdir
para crear una ruta de múltiples directorios y recibí false
cada vez. Una vez que usé mkdirs
mi problema se resolvió
Pensé que estaba teniendo este problema al depurar una aplicación. Estaba fallando porque la tarjeta SD estaba montada por la computadora host mientras se estaba depurando. El desmontaje de la computadora hizo que la aplicación funcionara de nuevo.
Sé que esta es una publicación antigua, pero pensé que todavía puedo ofrecer una sugerencia. Si está ejecutando su aplicación mientras está desarrollando (es decir, el teléfono está conectado a la PC a través de USB), entonces es probable que la PC haya montado la tarjeta SD. Debe desmontarlo (puede hacerlo desde el teléfono o desde la PC) para obtener el permiso de escritura, esto requiere que se haya configurado en el manifiesto.
También he tenido problemas al intentar crear directorios en la tarjeta SD. Descubrí que lo que estaba sucediendo es que mi código funcionaría bien en algunos teléfonos y también en el emulador. Sin embargo otros teléfonos reportan errores.
Creo que hay un problema con ciertos teléfonos, Atrix y Bionic son dos ejemplos.
Estos teléfonos cuando usan el código de Environment.getExternalStorageDirectory () realmente devuelven / mnt / sdcard.
Sin embargo, en estos teléfonos, la tarjeta SD es en realidad / mnt / sdcard-ext.
Así que en algún lugar parece que algunos fabricantes han roto el código getExternalStorageDirectory, y de alguna manera está devolviendo una ubicación falsa.
Me costó muchísimo descubrir esto porque mi código funcionaba en muchos dispositivos diferentes, y todavía algunos usuarios informaron que había fallado.
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 dispositivo! ¡Y ayudó! Es una pena que nadie haya aconsejado esto antes. Espero que esto ayude!
Yo tuve el mismo problema. Se estableció el permiso y también la ruta fue la predeterminada (/ mnt / sdcard) pero mi android se montó 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 al bucear en la concha adb:
$ 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 puede ver mientras está montada, la sdcard está en el grupo de usuarios del sistema y no hay ningún permiso. Después de desmontar, el grupo se cambia a sdcard_rw y se otorgan permisos para leer y escribir.