¿Cómo guardar archivos en una tarjeta SD externa en un Android no rooteado?

Estoy usando la aplicación Terminal Emulator en un teléfono Android 5.0.2 no rooteado.

Al mover archivos de una carpeta de la tarjeta SD externa a otra con:

mv /storage/extSdCard/DCIM/Camera/* /storage/extSdCard/phone/

Yo obtengo:

mv: rename /storage/extSdCard/DCIM/Camera/20170519_161315.jpg to 
     /storage/extSdCard/phone/20170519_161315.jpg: Permission denied

¿Hay alguna solución para esto (sin rootear el teléfono)?


Nota: ls -laen /storage/extSdCardda:

drwxrwx--x root     sdcard_r          2016-08-10 02:18 Android
drwxrwx--- root     sdcard_r          2016-11-20 09:45 DCIM
...
drwxrwx--- root     sdcard_r          2017-05-19 15:46 phone

Respuestas (1)

El acceso de escritura a nivel del sistema de archivos a una tarjeta SD externa física sin rootear el teléfono no es posible desde los días anteriores a KK. Sin embargo, las aplicaciones siempre pueden (con o sin permiso de almacenamiento) leer y escribir en sus directorios privados en almacenamientos compartidos. Para que pueda mover archivos a /storage/extSdCard/Android/data/.


En Android 6+, la tarjeta SD externa es visible donde /storage/[UUID]UUID es el del sistema de archivos. Esta ruta del sistema de archivos solo está disponible para lectura (para aplicaciones con READ|WRITE_EXTERNAL_STORAGEpermiso otorgado) y recorrido (para todas las aplicaciones). El último caso es permitir que las aplicaciones lean/escriban en sus directorios privados. Al igual que el sistema de archivos emulado interno, el control de permisos se implementa a través del espacio de nombres de montaje y everybody (9997)GID. La tarjeta SD está montada con tres VISTAS distintas de diferentes permisos:

ingrese la descripción de la imagen aquí

voldcrea un espacio de nombres de montaje aislado para cada aplicación y, según el estado del permiso de almacenamiento de la aplicación, monta un enlace VIEW to /storage/[UUID]. Para obtener detalles, consulte ¿Qué es /almacenamiento/emulado/0/? y ¿ Qué es el UID "u#_everybody"?


Dado que ninguna de las tres VISTAS tiene permiso de escritura , las aplicaciones no tienen acceso de escritura a nivel de sistema de archivos a directorios públicos en tarjetas SD externas. Sin embargo, las aplicaciones, como la mayoría de los exploradores de archivos, que utilizan Storage Access Framework ( SAF ) (o Scoped Directory Access en Android 7+ o Scoped External Storage Access en Android 10+) pueden crear y eliminar archivos en toda la tarjeta SD.


USB OTG se trata casi de manera similar, pero con una diferencia destacada :

"MOUNT_FLAG_VISIBLE significa que el volumen es visible para aplicaciones de terceros para el acceso directo al sistema de archivos
...
los volúmenes transitorios, como los dispositivos USB OTG, no deben marcarse como visibles; sus contenidos deben mostrarse a las aplicaciones a través de Storage Access Framework".

Por lo tanto, los USB no se exponen como VISTAS , sino que las aplicaciones ven /storage/[UUID]la ruta del sistema de archivos (que no es real) a través de SAF para leer y escribir. Es por eso que el contenido de los medios extraíbles tampoco está disponible a través de MediaStore . Ninguno disponible para aplicaciones a través de API :

"Las rutas devueltas no incluyen dispositivos transitorios, como unidades flash USB conectadas a dispositivos portátiles".

Múltiples dispositivos de almacenamiento externo :

"Los dispositivos de almacenamiento externo que aparecen a través de estas API deben ser una parte semipermanente del dispositivo (como una ranura para tarjeta SD en el compartimento de la batería). Los desarrolladores esperan que los datos almacenados en estas ubicaciones estén disponibles durante largos períodos de tiempo. Por esta razón , los dispositivos de almacenamiento transitorio (como las unidades de almacenamiento masivo USB) no deben mostrarse a través de estas API".

Sin embargo, Adoptable Storage siempre está visible para las aplicaciones , ya sea tarjeta SD o USB.


RELACIONADO: