SAF (Storage Access Framework) решает проблему записи SD-карты в Android 4.4 (KitKat)?
В Android 4.4 приложения из Play Store могут писать только в каталог приложения (например:/storage/extSdCar/Android/data / com.образец.myapp/) и приложения не могут писать, кроме этого каталога, на micro SD-карте. Поэтому я изучаю новый SAF API, чтобы проверить, могу ли я использовать SAF для записи на карту micro SD, отличную от каталога приложения.
я реализовал SAF, создав образец поставщика и клиентского приложения. В моем провайдере я попытался показать все содержимое SD-карта путем реализации следующего кода в queryRoots:
row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(new File("/storage/extSdCard")));
row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_RECENTS | Root.FLAG_SUPPORTS_SEARCH);
Я создал следующее намерение в моем клиенте, и я могу просматривать все содержимое SD-карты через моего провайдера из системного интерфейса SAF.
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_TITLE, "test.txt");
startActivityForResult(intent, WRITE_REQUEST_CODE);
когда я нажимаю кнопку Сохранить, я получаю сообщение об ошибке "не удалось сохранить документ".Но когда я перехожу к каталогу приложения (/storage/extSdCar/Android/data / com.образец.myprovider/) моего провайдера в системном интерфейсе, я могу сохранить документ. Также нет намерения, такого как намерение.CATEGORY_WRITABLE, так что я могу получить только документы, которые можно редактировать. Пожалуйста, помогите мне в следующих пунктах:
1.Похоже, что даже если мы используем SAF, все равно ограничение записи на карту micro SD остается прежним. Правильно ли это?
2.Есть ли способ, которым я могу создавать или удалять или изменять уже доступные файлы за пределами моего каталога приложения в micro SD card?
3.Кто решает FLAG_SUPPORTS_WRITE флаг для обычных пользовательских файлов, таких как Фотографии, Видео, Музыка, документы и т. д. ?
1 ответов
при использовании DocumentsProvider
, вы можете расширить доступ только к файлам на диске, к которым у вас уже есть доступ. Добавление DocumentsProvider
не дает вам никакого нового доступа, поэтому вам, вероятно, не нужно его реализовывать.
вы можете получить доступ на запись в любом месте на SD-карте с помощью ACTION_OPEN_DOCUMENT
или ACTION_CREATE_DOCUMENT
намерения, которые вы упомянули. Есть ExternalStorageProvider
встроенный в систему, которая имеет доступ ко всем SD-картам, и он с удовольствием делегирует вам доступ на запись после подтверждения пользователем через эти намерения.
пользователям может потребоваться включить "настройки > отображать расширенные устройства", чтобы показать SD-карты, предлагаемые ExternalStorageProvider
. Кроме того, если вы хотите ограничить взаимодействие пользователя с локальным хранилищем, вы можете установить EXTRA_LOCAL_ONLY
.
Что касается (2), Вы можете создавать новые файлы вне вашего каталога для конкретного пакета с помощью ACTION_CREATE_DOCUMENT
, и вы можете выбрать существующие файлы с любым намерением. Выбранные пользователем файлы можно удалить с помощью DocumentsContract.deleteDocument()
.
и (3), MediaDocumentsProvider
встроенный в платформу в настоящее время не распространяется FLAG_SUPPORTS_WRITE
для фотографий, видео и музыки.
надеюсь, что это помогает. :)