Как сохранить файлы на внешнюю SD-карту на Android без рута?

Я использую приложение Terminal Emulator на нерутированном телефоне Android 5.0.2.

При перемещении файлов из папки внешней SD-карты в другую с помощью:

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

Я получил:

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

Есть ли решение для этого (без рутирования телефона)?


Примечание: ls -laв /storage/extSdCardдает:

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

Ответы (1)

Доступ на запись на уровне файловой системы к физически внешней SD-карте без рутирования телефона невозможен со времен, предшествующих KK. Однако приложения всегда могут (с разрешением на хранилище или без него) читать и записывать в свои личные каталоги в общих хранилищах. Таким образом, вы можете перемещать файлы в /storage/extSdCard/Android/data/.


На Android 6+ внешняя SD-карта видна там, /storage/[UUID]где UUID соответствует файловой системе. Этот путь файловой системы доступен только для чтения (для приложений с READ|WRITE_EXTERNAL_STORAGEпредоставленным разрешением) и обхода (для всех приложений). В последнем случае приложения должны читать/записывать в свои личные каталоги. Как и внутренняя эмулируемая файловая система, контроль разрешений осуществляется через пространство имен монтирования и everybody (9997)GID. SD-карта монтируется с тремя разными ВИДАМИ разных разрешений:

введите описание изображения здесь

voldсоздает изолированное пространство имен монтирования для каждого приложения и, в зависимости от статуса разрешения приложения на хранилище, привязывает VIEW к /storage/[UUID]. Подробнее см. Что такое /storage/emulated/0/? и что такое UID «u#_everybody»?


Поскольку ни один из трех VIEWS не имеет разрешения на запись , приложения не имеют доступа на запись на уровне файловой системы к общедоступным каталогам на внешних SD-картах. Однако приложения, в основном проводники файлов, которые используют Storage Access Framework ( SAF ) (или ограниченный доступ к каталогу на Android 7+ или ограниченный доступ к внешнему хранилищу на Android 10+), могут создавать и удалять файлы на всей SD-карте.


USB OTG трактуется почти так же, но с одним заметным отличием :

«MOUNT_FLAG_VISIBLE означает, что том виден сторонним приложениям для прямого доступа к файловой системе.
...
временные тома, такие как устройства USB OTG, не должны быть помечены как видимые; их содержимое должно отображаться для приложений через Storage Access Framework».

Таким образом, USB-накопители не отображаются как VIEWS , вместо этого приложения видят /storage/[UUID](что не является фактическим) путь к файловой системе через SAF как для чтения, так и для записи. Поэтому содержимое съемных носителей также недоступно через MediaStore . Ни один из них не доступен для приложений через API :

«Возвращаемые пути не включают временные устройства, такие как флэш-накопители USB, подключенные к портативным устройствам».

Несколько внешних запоминающих устройств :

«Внешние устройства хранения, доступные через эти API, должны быть полупостоянной частью устройства (например, слотом для SD-карты в батарейном отсеке). Разработчики ожидают, что данные, хранящиеся в этих местах, будут доступны в течение длительного периода времени. По этой причине , временные запоминающие устройства (такие как USB-накопители) не должны открываться через эти API».

Однако Adoptable Storage всегда виден приложениям , будь то SD-карта или USB.


СВЯЗАННЫЙ: