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 для фотографий, видео и музыки.

надеюсь, что это помогает. :)