requestLegacyExternalStorage is not working in Android 11 - API 30
requestLegacyExternalStorage не работает в Android 11 - API 30
Недавно Google внес некоторые изменения, связанные с API хранилища в API 29, такие как хранилище с ограниченной областью действия, и мы отказались от них, добавив 'requestLegacyExternalStorage = true' в Манифест. Но теперь, когда я настраиваю targetSdkVersion 30, это, похоже, больше не работает. Некоторые файлы в каталогах загрузки не были перечислены (File.listFiles) после этого изменения.
Переведено автоматически
Ответ 1
Но теперь, когда я настраиваю targetSdkVersion 30, это, похоже, больше не работает
Все верно. Android 11 (API 30+) requestLegacyExternalStorage=true ничего не делает, и вы больше не можете "отказаться". Он был доступен в Android 10, чтобы предоставить разработчикам переходный / льготный период для перехода к модели хранилища с ограниченной областью действия.
Вариант 1: Перенесите данные в вашем приложении, по-прежнему ориентируясь на API 29, затем, как только перенесенные данные будут совместимы с хранилищем с ограниченной областью действия, вы сможете выпустить обновление, ориентированное на API 30 - https://developer.android.com/training/data-storage/use-cases
Это может привести к собственным проблемам, если пользователи пропустят эту версию и будут обновляться непосредственно с предыдущей версии до последней, и вы застряли с не перенесенными данными, к которым у вас нет доступа.
Существует вероятность того, что некоторые приложения просто не смогут успешно мигрировать, исходя из того, как они взаимодействовали с File API, поскольку решение Google не будет охватывать все текущие варианты использования, и может не быть пути миграции.
Например, пару лет назад я выпустил приложение, которое позволяло пользователям обновлять обложки альбомов с помощью MediaStore и ContentResolver обновлять данные для изображения обложки альбома - они хранились в общем хранилище. Посмотрев на исходный код Android 10 + AOSP, MediaProvider кажется, что приложения, которые раньше использовали MediaStore для обновления обложки альбома, чтобы указывать на файл данных, больше не работают, просто потому, что MediaProvider внутренне создает свою собственную обложку в скрытой .thumbnails папке, просматривая непосредственно mp3 и используя MediaExtractor, и никогда не ссылается на ContentValues, которые были вставлены для ссылки на обложку. Поэтому, хотя вы можете обновить обложку самостоятельно, запросить MediaStore ее и просмотреть, другим приложениям приходится использовать ContentResolver#loadThumbnail API 29+, который не ссылается на ваши обновленные значения и либо создает обложку лениво, либо выбирает уже созданный файл в .thumbnails папке. Очевидно, что ничего из этого не задокументировано, и я получил огромную негативную реакцию на свое приложение с отрицательными отзывами, однако эти изменения были кардинальными и полностью вышли из-под моего контроля, и мне пришлось просмотреть исходный код AOSP, чтобы обнаружить, что поведение Android кардинально изменилось.
(Это была не напыщенная речь, а пример того, как эти изменения не предложили пути миграции из-за фундаментального недокументированного поведения в AOSP).
requestLegacyExternalStorage будет продолжать работать независимо от целевого sdk
Устройства Android 11
новый SDK для таргетинга установки 29: requestLegacyExternalStorage значение соблюдено
новая установка sdk для таргетинга 30: requestLegacyExternalStorage всегда выполняется false
обновление с целевого sdk 29 до 30: если preserveLegacyExternalStorage установлено, то requestLegacyExternalStorage есть true (это чистый случай миграции, и это состояние не будет сохранено, если пользователь удалит / переустановит приложение)
На этом этапе вы в значительной степени вынуждены внедрять хранилище с ограниченной областью действия. Если вы не готовы к миграции, просто продолжайте использовать sdk 29, поскольку нет способа принудительно использовать устаревшее хранилище на устройствах Android 11 с target sdk 30.
обновление: для play Store требуется целевой sdk 30 по состоянию на август 2021 года
Ответ 3
Не делайте этого до начала 2021 года (указано Google):-
Если вы хотите настроить таргетинг на Android 11, вам следует использовать разрешение MANAGE_EXTERNAL_STORAGE .
Приложения, которые работают на Android 11, но нацелены на Android 10 (уровень API 29), по-прежнему могут запрашивать атрибут requestLegacyExternalStorage. Этот флаг позволяет приложениям временно отказаться от изменений, связанных с ограниченным хранилищем, таких как предоставление доступа к различным каталогам и различным типам медиафайлов. После обновления приложения до целевого Android 11 система игнорирует флаг requestLegacyExternalStorage.