Может ли StorageActionFramework ACTION_OPEN_DOCUMENT запросить один файл?

Есть ли способ использовать StorageActionFramework ACTION_OPEN_DOCUMENT с намерением запросить информацию для определенного файла? Более конкретно, у меня есть URI для конкретного файла, который я получил из MediaStore. Я хотел бы выяснить, есть ли у него доступ для записи и, если да, удалить его. Кроме того, я хотел бы сделать это без какого-либо пользовательского интерфейса (ни один не нужен в этом конкретном контексте).

Документация говорит, как сделать это для класса файлов, используя intent.addCategory (Intent.CATEGORY_OPENABLE), например. И чтобы ограничить его определенным типом файла, intent.setType ("image/*"), например. Но я не вижу ничего, чтобы ограничить его конкретным файлом.

Кроме того, я понимаю, что как только вы получите набор файлов от StorageActionFramework, вы сможете просматривать свойства для отдельных файлов.

Похоже, что если бы я мог использовать ACTION_OPEN_DOCUMENT, чтобы получить URI SAF, я мог бы затем использовать DocumentsContract.deleteDocument() удалить его.

Больше контекста

В моей ситуации пользователь вызвал приложение камеры из моего приложения и сделал один или несколько снимков. Затем мой код запрашивает MediaStore, чтобы определить имена файлов для нового изображения. Затем я хочу переместить файл (ы) в каталог, специфичный для моего приложения. Это прекрасно работает для файлов, находящихся во "внутреннем" и "внешнем" хранилище, но не для съемного хранилища.

В долгосрочной перспективе это решение является неадекватным, поскольку, очевидно, оно будет использоваться для большого количества постоянных хранилищ (хотя это уменьшается быстрыми темпами, когда объем хранилища увеличивается). Однако моему приложению нужен контроль над файлами изображений, которые берутся через приложение, и, следовательно, оставление их на съемном носителе может привести к поломке приложения.

Еще одним усложняющим фактором является отсутствие API Android, позволяющего делать несколько фотографий и сохранять их в указанном месте. Существует такой API для съемки одной фотографии, но он не будет работать для моего приложения. Таким образом, я вынужден позволить приложению камеры сохранять свои файлы там, где он хочет, а затем перемещать их впоследствии.

Некоторые другие приложения просто делают копии фотографий и хранят копию в личном каталоге. Я мог бы сделать это, но это усугубляет проблему хранения еще больше. Долгосрочное решение, вероятно, будет использовать облачное хранилище в сочетании с локальным частным кешем.

1 ответ

Есть ли способ использовать StorageActionFramework ACTION_OPEN_DOCUMENT с намерением запросить информацию для определенного файла?

Нет. Прежде всего, Storage Access Framework имеет мало общего с файлами.

Самая близкая вещь, которая соответствовала бы общей структуре, была бы, если бы вы могли предоставить стартовый Uri, чтобы позволить пользователям выбрать и открыть документ рядом с этим. Это было бы неплохо, но не поддерживается.

Документация говорит, как сделать это для класса файлов, используя, например, intent.addCategory (Intent.CATEGORY_OPENABLE).

Нет. CATEGORY_OPENABLE означает, что Uri что вы вернетесь должны работать с openInputStream(), openOutputStream()и связанные методы, и что query() на Uri должен быть в состоянии вернуть OpenableColumns, Это имеет мало общего с файлами.

И чтобы ограничить его определенным типом файла, intent.setType ("image/*")

Это ограничивает содержимое конкретным типом MIME (или подстановочным знаком). Это имеет мало общего с файлами.


Я хотел бы выяснить, есть ли у него доступ для записи и, если да, удалить его

Вы можете иметь право на запись, чтобы изменить содержимое, через openOutputStream(), Я не знаю, что у вас есть средства для удаления основного контента.

Кроме того, я хотел бы сделать это без какого-либо интерфейса

Единственная причина использовать ACTION_OPEN_DOCUMENT чтобы показать пользовательский интерфейс, чтобы позволить пользователю выбрать часть контента.


Мой код затем запрашивает MediaStore, чтобы определить имя файла для нового изображения

Поскольку приложение для камеры не требует обновления MediaStoreне похоже, что это будет особенно надежно.

Еще одним усложняющим фактором является отсутствие API Android, позволяющего делать несколько фотографий и сохранять их в указанном месте. Существует такой API для съемки одной фотографии, но он не будет работать для моего приложения

Поскольку для приложения камеры не требуется, чтобы пользователь мог делать несколько фотографий подряд, это не похоже на то, что оно будет особенно надежным.

Другие вопросы по тегам