Storage Access Framework в Android: полное руководство

Если приложение после обновления Android вдруг перестало видеть файлы в папке Documents или просит «выбрать папку» через непонятный системный диалог — перед вами почти наверняка Storage Access Framework (SAF), механизм, который Google сделал обязательным способом доступа к файлам начиная с Android 10–11. Прямой доступ к файловой системе по путям вроде /storage/emulated/0/ для обычных приложений фактически закрыт, и SAF стал единственным «легальным» мостом между приложением и документами пользователя.

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

Что такое Storage Access Framework

Storage Access Framework — это системный интерфейс Android, появившийся ещё в Android 4.4 (KitKat), который позволяет приложениям работать с файлами не по прямым путям, а через URI-документы, выдаваемые системой. Пользователь сам выбирает файл или папку в стандартном системном окне (оно называется DocumentsUI или просто «Файлы»), а приложение получает доступ только к выбранному объекту — и ни к чему больше.

Долгое время SAF существовал параллельно с классическим доступом по путям. Перелом произошёл с введением Scoped Storage (ограниченного хранилища) в Android 10 и его обязательного применения в Android 11: приложения, собранные под новые API, потеряли возможность свободно читать чужие файлы на общем накопителе. SAF из «опции» превратился в основной инструмент работы с документами.

Важно понимать: SAF — это не отдельное приложение и не настройка, которую можно «включить». Это архитектура, встроенная в систему, и взаимодействуете вы с ней каждый раз, когда видите системный диалог выбора файла с боковым меню «Загрузки», «Диск», «SD-карта».

Почему Google ввёл Scoped Storage и SAF

До Android 10 любое приложение с разрешением READ_EXTERNAL_STORAGE могло прочитать всё содержимое общего хранилища: ваши фото, документы, загрузки, базы данных других программ. Этим активно злоупотребляли — от сбора данных рекламными SDK до вымогательства. Scoped Storage и SAF стали ответом на эту проблему.

  • 🔒 Приватность — приложение видит только свою папку и те файлы, что пользователь выбрал вручную.
  • 🧹 Порядок в хранилище — программы перестали «мусорить» папками в корне накопителя; каждая работает в своём изолированном каталоге.
  • 🗑️ Чистое удаление — при деинсталляции приложения его изолированные данные удаляются вместе с ним, не оставляя «хвостов».
  • ☁️ Единый доступ к облакам — через SAF одинаково открываются файлы с Google Диска, SD-карты, USB-накопителя и локальной памяти.

У перемен есть и обратная сторона: скорость работы с большим количеством файлов через SAF заметно ниже, чем при прямом доступе по путям, поскольку каждая операция идёт через системные вызовы. Именно поэтому файловые менеджеры и галереи иногда «тормозят» при сканировании папок с тысячами документов.

Как SAF выглядит для пользователя

С точки зрения пользователя взаимодействие с Storage Access Framework сводится к нескольким типовым сценариям. Самый частый — приложение просит выбрать папку: открывается системное окно, где нужно перейти в нужный каталог и нажать кнопку вроде Использовать эту папку, а затем подтвердить разрешение. Так поступают, например, плееры, читалки и менеджеры загрузок.

Второй сценарий — выбор одного файла: вы нажимаете «Открыть» в приложении, система показывает документы, загрузки, облачные хранилища, и после выбора приложение получает доступ именно к этому файлу. Третий сценарий — сохранение: приложение просит указать, куда записать новый документ, и вы сами выбираете место и имя.

📊 Как часто вы сталкиваетесь с системным диалогом выбора папки (SAF) на своём Android?
Регулярно, несколько приложений просят доступ
Иногда, в основном при установке новых приложений
Редко, почти не замечаю
Впервые узнал(а), что это SAF

Отдельно стоит упомянуть доступ к SD-карте и USB-накопителям. На многих устройствах запись на внешнюю карту для сторонних приложений возможна только через SAF: нужно один раз выдать доступ к корню карты или конкретной папке, после чего приложение сможет там работать.

⚠️ Внимание: кнопка и формулировки в диалоге SAF зависят от версии Android и оболочки производителя (Samsung One UI, MIUI и др.). Если точного пункта из инструкции в интернете нет на вашем устройстве — это нормально, ищите аналогичный по смыслу.

Как выдать приложению доступ к папке через SAF

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

☑️ Проверка доступа к папке через SAF

Выполнено: 0 / 5

Если приложение «не видит» файлы даже после выдачи доступа, проверьте несколько моментов. Убедитесь, что вы выбрали правильную папку — доступ к родительской папке обычно покрывает вложенные, но доступ к вложенной не даёт прав на соседние. Проверьте, не был ли отозван доступ: в Настройки → Приложения → [приложение] → Разрешения на новых версиях Android есть пункты вроде Файлы и мультимедиа, а сами SAF-разрешения живут внутри приложения и сбрасываются при очистке его данных.

SAF с точки зрения разработчика

Для разработчиков SAF реализуется через интенты: ACTION_OPEN_DOCUMENT для открытия файла, ACTION_OPEN_DOCUMENT_TREE для выбора папки, ACTION_CREATE_DOCUMENT для создания нового документа. Результат возвращается в виде URI, а чтение и запись выполняются через ContentResolver и потоки ввода-вывода, а не через класс File.

Ключевая особенность — сохранение разрешений. По умолчанию доступ к URI действует до перезагрузки или отзыва, но его можно закрепить вызовом takePersistableUriPermission(), и тогда приложение сохранит доступ к папке даже после перезапуска устройства. Для работы с деревом документов используется библиотека DocumentFile из AndroidX.

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)

startActivityForResult(intent, REQUEST_CODE_FOLDER)

После получения URI разрешение закрепляется примерно так:

contentResolver.takePersistableUriPermission(

uri, Intent.FLAG_GRANT_READ_URI_PERMISSION

or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

Почему SAF медленнее прямого доступа к файлам

Каждая операция (открытие, чтение, перечисление файлов) идёт через системный ContentProvider и IPC-вызовы, а не напрямую в файловую систему. При работе с тысячами файлов задержки накапливаются. Оптимизации: кэшировать DocumentFile-объекты, минимизировать количество запросов listFiles, использовать потоковое чтение вместо повторных открытий URI.

Сравнение способов доступа к файлам в Android

Чтобы понять место SAF в экосистеме, полезно сравнить его с другими механизмами доступа к хранилищу, которые существуют в современном Android.

Способ доступаЧто доступноТребуется ли действие пользователяОграничения
Собственная папка приложенияТолько файлы самого приложенияНетУдаляется при деинсталляции
MediaStore APIФото, видео, аудио всех приложенийРазрешение в настройкахТолько медиафайлы, не документы
Storage Access FrameworkЛюбые файлы и папки по выбору пользователяДа, выбор в системном диалогеНиже скорость, доступ только к выбранному
MANAGE_EXTERNAL_STORAGEВсё хранилище целикомСпециальное разрешение в настройкахВыдаётся ограниченному кругу приложений, проверка Google Play

Разрешение MANAGE_EXTERNAL_STORAGE («доступ ко всем файлам») — исключение, предназначенное для файловых менеджеров, антивирусов и подобных утилит. Google Play требует обоснования его необходимости при публикации, поэтому обычным приложениям этот путь закрыт, и SAF остаётся их основным инструментом.

Типичные проблемы и их решения

Самая частая жалоба — «приложение не видит файлы». Возможные причины: доступ к папке не выдан или был сброшен, файлы лежат вне выбранной папки, либо приложение устарело и не умеет работать со Scoped Storage. Порядок действий: сначала заново выдайте доступ через SAF-диалог, затем проверьте обновления приложения, и только потом ищите альтернативу.

Вторая распространённая ситуация — невозможность записи на SD-карту. Здесь проверьте, выдавался ли доступ именно к карте (в боковом меню SAF-диалога она отображается отдельным пунктом), и не отформатирована ли карта в файловой системе, с которой есть нюансы совместимости. Третья проблема — медленная работа с большими папками: это ограничение самой архитектуры, и полностью устранить его со стороны пользователя нельзя.

⚠️ Внимание: не пытайтесь «обойти» SAF через root или сторонние патчи ради одного приложения — это ослабляет модель безопасности всей системы и может нарушить работу других программ. Сначала исчерпайте штатные способы: выдачу доступа, обновление приложения, выбор корректной папки.
  • 🔄 Приложение «забыло» папку — выдайте доступ заново; очистка данных приложения сбрасывает SAF-разрешения.
  • 📁 Неправильная папка — выбирайте каталог уровнем выше, чтобы покрыть все вложенные.
  • 💾 SD-карта недоступна для записи — убедитесь, что доступ выдан к корню карты или нужной папке на ней.
  • 🐢 Медленное сканирование — особенность SAF при большом числе файлов, лечится только оптимизацией самого приложения.

Часто задаваемые вопросы

Можно ли отключить Storage Access Framework на Android?

Нет, SAF — встроенная часть системы, начиная с Android 11 его модель доступа обязательна для приложений, собранных под новые версии API. Отключить её штатными средствами нельзя, и обходные пути через root создают больше проблем, чем решают.

Почему приложение каждый раз просит выбрать папку заново?

Возможные причины: разработчик не реализовал сохранение разрешения через takePersistableUriPermission, либо данные приложения очищаются (например, «оптимизатором» системы). Проверьте, не удаляет ли какая-то утилита данные приложения в фоне.

Чем SAF отличается от разрешения «Доступ ко всем файлам»?

SAF даёт доступ только к явно выбранным пользователем файлам и папкам, а MANAGE_EXTERNAL_STORAGE — ко всему хранилищу сразу. Второй вариант предназначен для узкого круга приложений (файловые менеджеры, антивирусы) и требует обоснования при публикации в Google Play.

Работает ли SAF с облачными хранилищами?

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

Безопасно ли выдавать приложению доступ к папке через SAF?

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