¿Por qué puedo escribir en "mnt / sdcard" y no en "mnt / extsd"?
Estoy tratando de almacenar un archivo en el almacenamiento externo (Android 4.2.2).
Estoy usando el permiso correcto en el manifest.xml:
- ¿Debo aprender Java antes de aprender Android
- Actualizar el complemento de Android Studio Gradle a la última versión
- Cómo agregar CardView dentro de Gridview
- Java.lang.NoClassDefFoundError: com / android / utils / ILogger en Visual Studio 2015
- Error al analizar xml: prefijo sin consolidar con el SDK de Facebook
<manifest ...> ... <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> ...
La tarjeta sd externa está disponible, puedo probarlo usando otra aplicación para leer y escribir archivos. La ruta / mnt / extsd / es válida, mira la imagen de abajo. La tarjeta sd externa es escribible porque puedo copiar / pegar archivos en ella.
El código:
try { String path = "/mnt/extsd/file.dat" File f = new File(path); f.createNewFile(); return true; } catch (Exception e) { e.printStackTrace(); return false; }
f.createNewFile();
el error en f.createNewFile();
:
W/System.err(2172): java.io.IOException: open failed: EACCES (Permission denied) W/System.err(2172): at java.io.File.createNewFile(File.java:948) W/System.err(2172): at solarapp.activities.settings.application.ActivityBackup$BackupTask.doInBackground(ActivityBackup.java:77) W/System.err(2172): at solarapp.activities.settings.application.ActivityBackup$BackupTask.doInBackground(ActivityBackup.java:1) W/System.err(2172): at android.os.AsyncTask$2.call(AsyncTask.java:287) W/System.err(2172): at java.util.concurrent.FutureTask.run(FutureTask.java:234) W/System.err(2172): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) W/System.err(2172): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) W/System.err(2172): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) W/System.err(2172): at java.lang.Thread.run(Thread.java:856) W/System.err(2172): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied) W/System.err(2172): at libcore.io.Posix.open(Native Method) W/System.err(2172): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) W/System.err(2172): at java.io.File.createNewFile(File.java:941)
Si utilizo String path = "/mnt/extsd/file.dat"
todo funciona bien! ¿Entonces, dónde está el problema?
EDITAR
Estoy utilizando esta solución para obtener la lista de almacenamiento disponible:
¿Cómo puedo obtener la lista de almacenamiento externo montado del dispositivo Android
Y, como sugerimos, publico el resultado del comando adb shell cat /proc/mounts
:
rootfs / rootfs rw 0 0 tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0 devpts /dev/pts devpts rw,relatime,mode=600 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,relatime 0 0 none /acct cgroup rw,relatime,cpuacct 0 0 tmpfs /mnt/secure tmpfs rw,relatime,mode=700 0 0 tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0 tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0 none /dev/cpuctl cgroup rw,relatime,cpu 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 /dev/block/by-name/system /system ext4 ro,relatime,data=ordered 0 0 /dev/block/by-name/cache /cache ext4 rw,nosuid,nodev,noatime,nomblk_io_submit,data=ordered 0 0 /dev/block/by-name/data /data ext4 rw,nosuid,nodev,noatime,nomblk_io_submit,noauto_da_alloc,data=ordered 0 0 /dev/block/vold/93:72 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0 /dev/block/vold/93:72 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0 tmpfs /mnt/sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0 /dev/block/vold/179:1 /mnt/extsd vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1023,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
Respuesta al comando adb shell cat /proc/partitions
major minor #blocks name 93 0 32768 nanda 93 8 16384 nandb 93 16 16384 nandc 93 24 786432 nandd 93 32 1048576 nande 93 40 16384 nandf 93 48 32768 nandg 93 56 524288 nandh 93 64 131072 nandi 93 72 4409344 nandj 179 0 3849216 mmcblk0 179 1 3845120 mmcblk0p1
Respuesta al comando adb shell cat /proc/devices and adb shell ls -l /mnt
Character devices: 1 mem 4 /dev/vc/0 4 tty 5 /dev/tty 5 /dev/console 5 /dev/ptmx 7 vcs 10 misc 13 input 29 fb 81 video4linux 100 telephony 108 ppp 116 alsa 128 ptm 136 pts 150 cedar_dev 166 ttyACM 180 usb 188 ttyUSB 189 usb_device 216 rfcomm 247 lcd 248 capture 249 disp 250 ttyGS 251 ttyS 252 sunxi_pwm 253 bsg 254 rtc Block devices: 259 blkext 7 loop 8 sd 65 sd 66 sd 67 sd 68 sd 69 sd 70 sd 71 sd 93 nand 128 sd 129 sd 130 sd 131 sd 132 sd 133 sd 134 sd 135 sd 179 mmc 254 device-mapper /system/bin/sh: cat: and: No such file or directory /system/bin/sh: cat: adb: No such file or directory /system/bin/sh: cat: shell: No such file or directory /system/bin/sh: cat: ls: No such file or directory /system/bin/sh: cat: -l: No such file or directory /system/bin/sh: cat: /mnt: Is a directory
Respuesta al comando adb shell ls -l /mnt
drwxr-xr-x root system 2014-04-22 11:56 asec d---rwxr-x system media_rw 1970-01-01 01:00 extsd drwxrwx--- media_rw media_rw 2014-04-22 11:56 media drwxr-xr-x root system 2014-04-22 11:56 obb d---rwxr-x system sdcard_rw 2014-04-22 12:26 sdcard drwx------ root root 2014-04-22 11:56 secure drwx------ shell shell 2014-04-22 11:56 shell d--------- system system 2014-04-22 11:56 usbhost1
- ¿Por qué no aparece la fecha de lanzamiento de Android?
- Observable vs Flujo rxJava2
- Android Almacenamiento interno VS Preferencias compartidas
- ¿Cuándo debe y no debe romperse de OOP para velocidad / rendimiento?
- Clave de String en Java RSA
- Cómo convertir matriz de bytes de una imagen a una cadena codificada en base64 que representa un jpg
- Desempeño de Android: Strings vs. Enums vs. Static Final Ints
- Cómo manejar una intención SEND silenciosa con una actividad sin cabeza
Response to the command adb shell ls -l /mnt d---rwxr-x system media_rw 1970-01-01 01:00 extsd
Para escribir extsd
el proceso necesita ser parte del grupo media_rw
pero WRITE_EXTERNAL_STORAGE
agregarlo al grupo sdcard_rw
. El permiso que necesitas es WRITE_MEDIA_STORAGE
pero, lamentablemente, su nivel de protección es signatureOrSystem
, por lo que no puedes usarlo en tu aplicación.
- Reemplazar + con espacio en html Gmail / Android cromo
- Inicio rápido de la unidad NullPointerException