#android #mediastore #android-10.0 #android-11 #storage-access-framework
Вопрос:
Я хотел бы написать приложение, которое обрезает/изменяет размер фотографий и записывает их обратно в общее хранилище в новом размере, но все, что я читал о том, как работают SAF и mediastore, предполагает, что в лучшем случае я смогу записать файл обратно только с новым именем. И в худшем случае я вообще не смогу открыть файлы, если я не являюсь их первоначальным создателем. Решение, которое включает запуск диалогового окна SAF для открытия файла, является разумным, хотя я хотел бы иметь возможность просто пакетно изменять все файлы (фотографии) в папке (скажем, dcim). Но если мне придется также запустить диалоговое окно SAF, чтобы записать файл обратно, это довольно неприятно.
Очевидно, что если бы я был нацелен на версии Android до 10, это все еще можно было бы сделать, но тогда я был бы заблокирован в playstore, и я действительно не хочу писать приложения, которые могу использовать только я.
Ответ №1:
все, что я читал о том, как работают SAF и mediastore, говорит о том, что в лучшем случае я смогу записать файл обратно только с новым именем
Используйте ACTION_OPEN_DOCUMENT
(или ActivityResultContracts.OpenDocument
). У вас есть полный доступ для чтения и записи к контенту, определяемому Uri
тем, что вы получаете.
Решение, которое включает запуск диалогового окна SAF для открытия файла, является разумным, хотя я хотел бы иметь возможность просто пакетно изменять все файлы (фотографии) в папке (скажем, dcim).
Используйте ACTION_OPEN_DOCUMENT_TREE
(или ActivityResultContracts.OpenDocumentTree
). У вас есть полный доступ для чтения и записи ко всем документам внутри этого дерева.
Комментарии:
1. Я думал, что ACTION_OPEN_DOCUMENT_TREE был заблокирован для многих из этих предопределенных каталогов (загрузки, dcim и т. Д.). И вы уверены, что у вас есть доступ к файлам, которые вы не создавали в загробных мирах? Когда вы говорите «полный доступ для чтения и записи», вы имеете в виду файловый Api, SAF или хранилище мультимедиа?
2. @AlRo: «Я думал, что ACTION_OPEN_DOCUMENT_TREE был заблокирован для многих из этих предопределенных каталогов (загрузки, dcim и т. Д.)»-вы получаете то, что получаете. «Когда вы говорите» полный доступ для чтения и записи», вы имеете в виду файловый Api, SAF или хранилище мультимедиа? » —
ACTION_OPEN_DOCUMENT
иACTION_OPEN_DOCUMENT_TREE
являются частью платформы доступа к хранилищу (SAF).3. Я готов использовать любой API, который не постоянно открывает диалоговое окно выбора файла (один раз, чтобы получить разрешения, это нормально), но я, безусловно, предпочитаю файловый API за его простоту и знакомство.
4. @AlRo: У вас нет доступа для записи в файловую систему к подавляющему большинству внешних хранилищ на Android 11 , включая практически все, что вас, похоже, интересует. Ваш выбор-SAF или
MediaStore
.MediaStore
позволяет вам создавать свой собственный пользовательский интерфейс для выбора изображений, но способ, которым вы получаете доступ на запись, немного странный. SAF может предоставить вам долгосрочные разрешения, но устройство управляет пользовательским интерфейсом выбора.5.@AlRo: У меня есть 14 сообщений в блоге , посвященных СВС и
MediaStore
, начиная с этого. Вы также можете увидеть примерMediaStore
здесь, описанный в этой книге.