Storage access framework что это

Обновлено: 07.07.2024


Скоро выходит Android 12, но в этом августе уже с 11-й версии разработчикам придётся использовать новые стандарты доступа приложений к внешним файлам. Если раньше можно было просто поставить флаг, что ваше приложение не поддерживает нововведения, то скоро они станут обязательными для всех. Главный фокус — повышение безопасности.

Переход на новую версию API — довольно трудоёмкая операция, требующая больших затрат на её поддержку при введении крупных апдейтов. Далее расскажу немного про наш переход и возникшие при этом трудности.

Что происходит

Если вы уже знакомы с теорией, то этот раздел можно пропустить — тут я хочу поверхностно сравнить подходы к предмету в разных версиях операционной системы.

В Android есть внутреннее Internal Storage (IS) и внешнее хранилище External Storage (ES). Исторически это были встроенная память в телефоне и внешняя SD-карта, поэтому ES был больше, но медленнее и дешевле. Отсюда и разделение — настройки и критически важное записывали в IS, а в ES хранили данные и большие файлы, например, медиа. Потом ES тоже стал встраиваться в телефон, но разделение, по крайней мере логическое, осталось.

У приложения всегда есть доступ к IS, и там оно может делать что угодно. Но эта папка только для конкретного приложения и она ограничена в памяти. К ES нужно было получать доступ и, кроме манипуляции со своими данными, можно было получить доступ к данным других приложений и производить с ними любые действия (редактировать, удалять или украсть).

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

В Android решили всё это переделать ещё в 10-й версии, а в 11-й это стало обязательным.

Чтобы минимизировать риски для пользователя в Google решили внедрить Scoped Storage (SS) в ES. Возможность проникнуть в папки других приложений убрали, а доступ есть только к своим данным — теперь это сугубо личная папка. А IS с 10-й версии ещё и зашифрована по умолчанию.

В Android 11 Google зафорсировала использование SS — когда таргет-версия SDK повышается до 30-й версии API, то нужно использовать SS, иначе будут ошибки, связанные с доступом к файлам. Фишка Android в том, что можно заявить совместимость с определённой версией ОС. Те, кто не переходили на 11, просто говорили, что пока не совместимы с этой версий, но теперь нужно начать поддерживать нововведения всем. С осени не получится заливать апдейты, если не поддерживаешь Android 11, а с августа нельзя будет заливать новые приложения.

Если SS не поддерживается (для девайсов ниже 10-й версии), то для доступа к данным других приложений требуется получить доступ к чтению и записи в память. Иначе придётся получать доступ к файлам через Media Content, Storage Access Framework или новый, появившийся в 11-м Android, фреймворк Datasets в зависимости от типа данных. Здесь тоже придётся получать разрешение доступа к файлу, но по более интересной схеме. Когда расшариваемый файл создаёшь сам, то доступ к нему не нужен. Но если переустановить приложение — доступ к нему опять потребуется. К каждому файлу система привязывает приложение, поэтому когда запрашиваешь доступ, его может не оказаться. Особо беспокоиться не нужно, это сложно отследить, поэтому лучше просто сразу запрашивать пермишен.

Media Content, SAF и Datasets относятся к Shared Storage (ShS). При удалении приложения расшаренные данные не удаляются. Это полезно, если не хочется потерять нужный контент.

Хотя даже при наличии SS можно дать доступ к своим файлам по определённой технологии — через FileProvider можно указать возможность получения доступа к своим файлам из другого приложения. Это нормально, потому что файлы расшаривает сам разработчик.

Также добавилась фича — если приложение не использовалось несколько месяцев, то снимаются все пермишены и доступы к системным элементам. По best practice разрешение запрашивается по необходимости (то есть непосредственно перед использованием того, на что спрашиваем разрешение), поэтому мы просто перед выполнением какого-либо действия проверяем, есть ли у нас пермишены. Если нет, то запрашиваем.

В то же время перекрыли доступы к приложениям внутри девайса. Если раньше можно было отследить, что установлены определённые приложения и отправлять к ним соответствующие интенты, то сейчас мы должны прямо в манифесте прописать, что работаем именно с этими приложениями, и только после этого получить доступ.

В качестве примера можем взять шаринг — мы шарим множество приложений, и их всех нужно указывать в манифесте, иначе они не обнаружатся. Начнём перебирать пакет установленных приложений — будет информация, что не указанного в манифесте приложения нет и при шаринге всё отвалится.

Перейдём к практике.

Переход на новую версию

Основная функциональность по работе с файлами в приложении iFunny представлена в виде сохранения мемов в память и расшаривания их между приложениями. Это было первое, что требовалось починить.

Для этого выделили в общий интерфейс работу с файлами, реализация которого зависела от версии API.

FilesManipulator представляет собой интерфейс, который знает, как работать с файлами и предоставляет разработчику API для записи информации в файл. Copier — это интерфейс, который разработчик должен реализовать, и в который передаётся поток вывода. Грубо говоря, мы не заботимся о том, как создаются файлы, мы работаем только с потоком вывода. Под капотом до 10-й версии Android в FilesManipulator происходит работа с File API, после 10-й (и включая её) — MediaStore API.

Рассмотрим на примере сохранения картинки.

Так как операция сохранения медиафайлов достаточно длительная, то целесообразно использовать MediaStore.Images.Media.IS_PENDING , которая при установлении значения 0 не дает видеть файл приложениям, отличного от текущего.

По сути, вся работа с файлами реализована через эти классы. Шаринг в другие приложения автоматически сохраняют медиа в память устройства и последующая работа с URI уже происходит по новому пути. Но есть такие SDK, которые ещё не успели перестроиться под новые реалии и до сих пор используют File API для проверки медиа. В этом случае используем кеш из External Storage и при необходимости провайдим доступ к файлу через FileProvider API.

Помимо ограничений с памятью в приложениях, таргетированных на 30-ю версию API, появилось ограничение на видимость приложения. Так как iFunny использует шаринг во множество приложений, то данная функциональность была сломана полностью. К счастью, достаточно добавить в манифест query, открывающую область видимости к приложению, и можно будет также полноценно использовать SDK.

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

После проверок запуска UI-тестов на девайсах с версиями API 29-30 было выявлено, что они также перестали корректно отрабатываться.

Эта проблема из разряда видимости других приложений, поэтому достаточно было добавить строку <package android:name="androidx.test.orchestrator" />
.

Тест удачно запустился, но возникла другая ошибка — Allure не может сохранить отчёт в память устройства, падает с ошибкой.

Очевидно из-за Scoped Storage стало невозможно сохранять файлы в другие папки, поэтому снова почитав документацию по управлению файлами в памяти на девайсе, обнаружил интересный раздел. Там рассказано, как для нужд тестов открыть доступ к папкам девайса, но с существенными ограничениями, которые можно почитать тут.

Так как нам нужно использовать этот пермишен только для тестов, то нам условия подходят. Поэтому я быстренько написал свой ShellCommandExecutor, который выполняет команду adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow на создании раннера тестов.

На Android 11 тесты удачно запустились и стали проходить без ошибок.

После попытки запуска на 10-й версии Android обнаружил, что отчет Allure также перестал сохраняться в память девайса. Посмотрев issue Allure, обнаружил, что проблема известная, как и с 11-й версией. Достаточно выполнить команду adb shell appops set --uid PACKAGE_NAME LEGACY_STORAGE allow . Сказано, сделано.

Запустил тесты — всё еще не происходит сохранения в память отчёта. Тогда я обнаружил, что в манифесте WRITE_EXTERNAL_STORAGE ограничен верхней планкой до 28 версии API, то есть запрашивая работу памятью мы не предоставили все разрешения. После изменения верхней планки (конечно, для варианта debug) и запроса пермишена на запись тесты удачно запустились и отчёт Allure сохранился в память устройства.

Добавлены следующие определения пермишенов для debug-сборки.

После всех вышеописанных манипуляций с приложением, можно спокойно устанавливать targetSdkVersion 30, загружать в Google Play и не беспокоиться про дедлайн, после которого загружать приложения версией ниже станет невозможно.

Android 11 Hero

Когда Android 10 все еще находился на раннем этапе бета-тестирования, Google планировал большие изменения в том, как приложения могут получать доступ к файлам и папкам во внешнем хранилище вашего телефона (например, фотографии, которые вы или другие приложения помещали в / data / media). папка, а не SD-карта присутствует во многих моделях Android).

Это изменение было известно как Scoped Storage , и его целью было убить злоупотребление разрешениями READ_EXTERNAL_STORAGE, которые так любят запрашивать многие приложения и разработчики.

Первоначально эти изменения планировалось применить ко всем приложениям на телефоне под управлением Android 10 или более поздней версии, но из-за обратной реакции разработчиков Google изменил курс и требовал использования Scoped Storage только для приложений, ориентированных на уровень API Android 29, то есть Android 10. Но с Android 11 Scoped Storage вернулась, и Google вряд ли передумает на этот раз.

Топ 10 функций в Android 11, о которых вы должны знать прямо сейчас

Как работает Scoped Storage

Google Files App Hero

Источник: Android Central

Когда-то Android работал как любая другая настольная операционная система, когда дело дошло до доступа к вашим файлам; такие вещи, как документы, фотографии, музыка или что-либо еще, что вы хотели сохранить на своем устройстве, были открыты для любого другого приложения. Вы сказали, что это нормально для приложения, чтобы сделать это, когда вы установили его, и это просто так. Используя собственный пользовательский интерфейс приложения, вы можете просматривать файловую систему и просматривать все ваши общедоступные файлы.

С Android 4.4 KitKat Google начал вносить изменения и добавлять ограничения на то, как приложение может обращаться к файлам, которые ему не принадлежали, а с Android 5.1 была реализована Storage Access Framework. Это дало приложениям доступ к файлам в других папках с помощью Android API вместо стандартных операций с файлами. Оно работает. Он медленный и довольно непопулярный, но он доступен, и к настоящему времени почти каждый разработчик приложения, которому необходим такой вид глобального доступа, по крайней мере попробовал его, чтобы увидеть, насколько он подходит или не основан на их потребностях.

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

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

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

Разработчики, которым необходим доступ к папкам, не принадлежащим их приложению, должны будут использовать API-интерфейсы Storage Access Framework . Это означает, что он должен запросить API, чтобы увидеть, существуют ли файлы и узнать местоположение устройства, а затем попросить пользователя разрешить его использование. Это был рекомендуемый лучший способ доступа к файлам со времен Android Lollipop, так что он не совсем новый. Но с Scoped Storage это теперь строго соблюдается и больше не является «необязательным».

Зачем делать это изменение?

Scoped Storage Media Files

Google приводит две веские причины, по которым он вносит это изменение: безопасность и сокращение остатков «беспорядка в приложениях».

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

Причина изменения хорошая, но для разработчиков это означает больше работы.

Во-вторых, что не менее важно, оно сокращает злоупотребление разрешением READ_EXTERNAL_STORAGE. Когда вы предоставляете это разрешение для приложения сегодня, оно дает доступ ко всему внешнему хранилищу, где мы сохраняем такие вещи, как фотографии, личные документы, видео и другие потенциально важные файлы. При использовании Scoped Storage приложения могут видеть только свои собственные папки с данными, а также определенные типы мультимедиа, например музыкальные файлы, с использованием других API-интерфейсов хранилища.

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

Эти API-интерфейсы могут предоставлять доступ для просмотра, записи, удаления и даже групповых действий с помощью встроенной в систему пользовательской подсказки, которая позволяет вам разрешать или запрещать действие. Эти API-интерфейсы должны упростить разработку приложений, таких как музыкальные проигрыватели или редакторы фотографий, даже без применения Scoped Storage.

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

Как насчет файловых менеджеров?

Scoped Storage Special Access

Разработчики приложений, таких как файловые менеджеры, которым нужен доступ к каждому файлу во внешнем хранилище, могут сделать это через Storage Access Framework после получения разрешения от Google — в октябре 2019 года на саммите разработчиков Android мы узнали, что программа, обеспечивающая «специальный доступ», была реализуется.

Легитимным приложениям нужны эти специальные разрешения.

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

На этот раз произойдет Scoped Storage

Ранние отзывы о Scoped Storage были не очень хорошими. Была даже петиция, в которой просили Google удалить функцию, пересмотреть ее реализацию.

Что в основном то, что сделал Google. Хранилище Scoped Storage было доступно в официальной версии Android 10, но разработчики не были обязаны его использовать. Но это все изменится.

Начиная с сентября 2020 года приложения должны будут ориентироваться на Android 10 или более позднюю версию, если они будут доступны в магазине Play Store.

Любое приложение, предназначенное для Android 10 или более поздней версии, должно использовать новые API хранилища, в том числе Scoped Storage. Изменения в соглашении разработчика Google Play говорят о том, что с 1 августа 2020 года все новые приложения, представленные в Google Play, должны быть ориентированы на Android 10 или более позднюю версию, а все обновления существующих приложений должны быть ориентированы на Android 10 или более позднюю версию с 1 ноября 2020 г.

Это означает, что если разработчик приложения не захочет позволить приложению увядать и умирать в море старых приложений, Scoped Storage должна быть внедрена в ближайшее время. К счастью, на этот раз Google выслушал отзывы и упростил работу приложений, которым необходим полный или специальный доступ, а новые API в Android 11 также упростили другие задачи. Мы все должны хотеть более безопасный и безопасный Android.

Мы можем заработать комиссию за покупки, используя наши ссылки. Узнайте больше


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

В целях повышения конфиденциальности пользователей Android 11 добавлены некоторые существенные изменения и ограничения. Как указано в превью поведенческих изменений, они состоят в следующем:

Принудительное использование хранилища с ограниченной областью видимости (Scoped storage): доступ к каталогам внешних хранилищ ограничен каталогом конкретного приложения и определенными типами носителей, созданных приложением.

Автоматический сброс разрешений: если пользователи не взаимодействовали с приложением в течение нескольких месяцев, система автоматически сбрасывает конфиденциальные разрешения приложения.

Фоновый доступ к местоположению: пользователи должны быть направлены в системные настройки, чтобы предоставить приложениям разрешение на фоновое определение местоположения.

Видимость пакета: когда приложение запрашивает список установленных приложений на устройстве, возвращенный список фильтруется.

Недавно я глубоко погрузился в концепцию Scoped storage, чтобы понять, чего ожидать в будущем, и соответственно подготовить свое Android-приложение к переменам.

Прежде чем перейти к тому, что касается реализации, сначала разберемся, как было организовано хранилище данных до Android 10:


  • Частное хранилище (Private Storage): все приложения имеют собственный частный каталог во внутреннем хранилище, то есть Android/data/, невидимый для других приложений.
  • Общее хранилище (Shared Storage): остальная часть хранилища, помимо частных разделов, называлась общим хранилищем. Оно включает в себя все медиа- и немедийные файлы, сохраненные в системе, и приложение с разрешением на хранение может легко получить к ним доступ.

Есть ли , на ваш взгляд, какие-то проблемы в структуре, которую мы рассмотрели выше? Не хотелось ли вам, чтобы Google что-нибудь здесь изменил?

Давайте подробнее остановимся на некоторых проблемах.

  • Допустим, у нас приложение для электронной коммерции, которому нужен доступ к хранилищу только для того, чтобы пользователь смог загрузить фото профиля. Значит, ему нужно предоставить доступ к определенному файлу или файловой системе. Другой пример: нам нужно загрузить или сохранить медиа-файл из чат-приложения, а для этого нужен доступ к одному медиа-файлу. Так зачем же предоставлять доступ к хранилищу целиком?
  • Может оказаться так, что конфиденциальные данные, такие как медицинские рецепты или банковские чеки, будут доступны всем приложениям, установленным на устройстве.
  • После удаления приложения нет возможности убедиться, что все связанные с ним данные и файлы полностью очищены.

Уверен, это должно заставить вас задуматься о безопасности приложений и данных, а также о конфиденциальности и организации. Не волнуйтесь, недавнее обновление Google для Android уже спешит на помощь.

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

Песочница приложений, изолирующая приложения друг от друга, — это ключевая часть дизайна Android. Взяв за основу все тот же самый основополагающий принцип, в Android Q компания Google представила хранилище с ограниченной областью видимости.

Эти изменения первоначально планировалось применить к каждому приложению на телефоне под управлением Android 10 или более поздней версии, но из-за негативной реакции разработчиков Google изменил курс и потребовал использовать хранилище с ограниченной областью видимости только для приложений, ориентированных на Android API уровня 29, то есть Android 10. Но с Android 11 Scoped Storage вернулся, и на сей раз Google вряд ли передумает.

  • Улучшенная атрибуция: приложению будет предоставлен доступ к блокам хранения, которые содержат соответствующие данные приложения.

Посмотрите на структуру хранения данных в Android 10 и выше:


Частное хранилище остается без изменений, но общее хранилище дополнительно делится на коллекцию медиа и загрузок (немедийных файлов).

  • Уменьшение беспорядка в файлах: система свяжет хранилище с приложениями-владельцами, чтобы системе было легче находить файлы, относящиеся к приложению. Таким образом, при удалении приложения все связанные с ним данные также будут удалены.
  • Предотвращение злоупотребления разрешением READ_EXTERNAL_STORAGE: предоставление этого разрешения на сегодняшний день дает приложению доступ ко всему внешнему хранилищу, где хранятся личные фотографии, документы, видео и другие потенциально конфиденциальные файлы. Однако при применении Scoped storage приложения смогут видеть только собственные папки данных и определенные типы носителей, такие как музыкальные файлы, используя другие API хранилища.

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


  • Неограниченный доступ к индивидуальному хранилищу приложений: приложение будет иметь неограниченный доступ к внутреннему и внешнему хранилищу как для чтения, так и для записи. В Android 10 не нужно предоставлять разрешение на хранение для записи файлов в каталог приложений на SD-карте.
  • Неограниченный доступ к коллекциям медиафайлов и загрузок (добавленным собственноручно): вы получаете неограниченный доступ для добавления файлов в коллекции и загрузки приложения. При сохранении изображения, видео или любого другого медиафайла из коллекции не нужно запрашивать разрешение (если файл хранится в организованной коллекции.)
  • Доступ к коллекции медиафайлов других приложений можно получить с помощью разрешения READ_STORAGE_PERMISSION. Разрешение WRITE_STORAGE_PERMISSION со следующей версии станет устаревшим и будет работать так же, как READ_STORAGE_PERMISSION.
  • Для записи и чтения немедийных файлов, добавляемых другими приложениями, понадобятся API-интерфейсы доступа к хранилищу.

Примечание из документации по обновлению хранилища в Android 11: Если приложение использует устаревшую модель хранения и ранее предназначалось для Android 10 или ниже, возможно, его данные сохраняются в каталоге, к которому приложение не может получить доступ, когда задействована модель хранилища с областью видимости. Прежде чем перейти на Android 11, перенесите данные в каталог, совместимый с хранилищем ограниченной области видимости. В большинстве случаев перенести данные можно в каталог конкретного приложения.


Чтобы дать разработчикам дополнительное время для тестирования, приложения, ориентированные на Android 10 (уровень API 29), все еще могут запрашивать атрибут requestLegacyExternalStorage. Этот флаг позволяет приложениям временно отказаться от изменений, связанных с областью хранения, таких как предоставление доступа к различным каталогам и различным типам медиафайлов.

Любое приложение, предназначенное для Android 11 или более поздней версии, должно использовать новые API хранилища, включая хранилище с ограниченной областью видимости. Изменения в соглашении разработчика Google Play гласят, что, начиная с 1 августа 2020 года, все новые приложения, представленные в Google Play, должны быть нацелены на Android 10 или более позднюю версию, а все обновления существующих приложений должны быть ориентированы на Android 10 или более позднюю версию с 1 ноября 2020 года. Если все продолжится в том же духе, то в следующем году приложения, скорее всего, будет обязательно ориентировать уже на Android 11.

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

Кратко рассмотрим некоторые часто выполняемые операции хранения и способы их выполнения:

  • Выбор файла: используйте ACTION_OPEN_DOCUMENT — он открывает системное приложение для выбора файлов, предоставляя пользователю возможность выбрал файл, который нужно открыть. Чтобы отобразить только те типы файлов, которые поддерживаются приложением, укажите тип MIME.
  • Выбор папки: Интент ACTION_OPEN_DOCUMENT можно заменить на ACTION_OPEN_DOCUMENT_TREE .

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

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

  • Создание файла: чтобы сохранить файл в определенном месте, используйте ACTION_CREATE_DOCUMENT .

Примечание из документации разработчиков Android: ACTION_CREATE_DOCUMENT не может перезаписать существующий файл. Если приложение пытается сохранить файл с тем же именем, система добавляет число в скобках в конце имени файла.

Если приложение предназначено для Android 10 (уровень API 29) или выше, то для того, чтобы оно могло извлекать неотредактированные метаданные Exif из фотографий, необходимо объявить разрешение ACCESS_MEDIA_LOCATION в манифесте приложения, а затем запросить это разрешение во время выполнения.

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

Существует обходной путь для приложений по типу файловых менеджеров, которые тоже должны иметь полный доступ ко всему. Нужно выполнить следующие простые шаги, перечисленные в инструкции по обновлению хранилища в Android 11:

Приложениям, действующим по закону, эти разрешения необходимы.

Как только пользователь предоставит разрешение на широкий доступ, он получит нефильтрованное представление MediaStore, которое включает в себя немедийные файлы.

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

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


Scoped Storage? Боль или не боль?

Обновление приложения @Voice Aloud Reader

Что же такое Scoped Storage?

Подобный принцип работы наблюдается в iOS. И примерно также работают вкладки Chrome, правда в этом случае они изолируются на процессы. Такая изоляция позволит улучшить безопасность системы, и приложения не смогут получать доступ к важным данным на смартфоне. Для взаимодействия с файловой системой Google предлагает использовать API Storage Access Framework. И разработчикам оно не очень нравится за счет медленной работы и плохой документации. По скриншоту ниже видно, насколько медленно работает новое API. В среднем SAF в 25-50 раз дольше работает с файлами.


Но проблема не только в этом. В Scoped Storage разработчикам приложений необходимо при работе с каким-либо файлом сначала копировать его в собственную изолированную (scoped) область памяти, и уже затем производить с ней манипуляции. Представьте какой-нибудь редактор видео. Вы открываете видеоролик размером в 5 гигабайт, и приложению нужно будет сделать его копию в своей области памяти, чтобы иметь возможность изменять его. К тому же судьба тысячи файловых менеджеров в Google Play теперь под вопросом. Как они будут работать со всей памятью телефона, если будут иметь ограниченный доступ к ней? Это пока загадка.

Почему Scoped Storage не такой плохой

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

Я пошёл еще дальше, и изучил подкаст разработчиков Android (с 24:42 минуты), которые объяснили, зачем нужен Scoped Storage.

А что думаете вы? Делитесь мнением в комментариях и не забывайте про наш чат Телеграм.

Читайте также: