DocumentProvider — что это, создание провайдера и работа с файлами

Автор: IT Sectr Опубликовано: 2026-07-10 Время чтения: 6 мин

DocumentProvider — это абстрактный класс Android, реализующий контент-провайдер для доступа к файлам через Storage Access Framework. Провайдер регистрируется в AndroidManifest.xml и предоставляет файлы другим приложениям через системный пикер. По данным Android Developers (2026), DocumentsProvider требует реализации методов queryRoots, queryDocument и queryChildDocuments для отображения файловой структуры в диалоге выбора.

Главное

  • DocumentsProvider — абстрактный класс для создания кастомного файлового провайдера в Android.
  • Хранилища — провайдер может подключать локальные файлы, облачные сервисы и виртуальные документы.
  • queryRoots — обязательный метод, возвращающий корневые директории хранилища.
  • queryChildDocuments — возвращает содержимое директории для навигации в пикере.
  • Регистрация в AndroidManifest с intent-фильтром android.content.action.DOCUMENTS_PROVIDER.

Что такое DocumentProvider?

DocumentsProvider — это базовый класс Android, наследующий ContentProvider, который позволяет приложению предоставлять свои файлы другим приложениям через системный интерфейс SAF. Провайдер создаёт виртуальную файловую систему, которую видит пользователь в диалоге выбора документов.

Каждый провайдер организует файлы в корни (roots) — верхнеуровневые точки входа. Например, Google Drive имеет корни "Мой диск" и "Доступные мне". Внутри корня провайдер возвращает дерево документов, где каждый документ — это файл или директория с определёнными MIME-типом, размером и датами.

DocumentProvider входит в состав android.provider пакета и доступен начиная с Android 4.4 (API 19). Провайдер используется облачными сервисами, менеджерами паролей, приложениями заметок и любыми программами, хранящими файлы в собственном формате.

Как создать кастомный DocumentProvider

Создание собственного DocumentProvider начинается с наследования класса DocumentsProvider и реализации четырёх обязательных методов. Провайдер определяет файловую структуру, которая отображается в системном пикере SAF при выборе файлов.

Первый метод — queryRoots, который возвращает курсор с колонками Root.COLUMN_ROOT_ID, Root.COLUMN_TITLE, Root.COLUMN_SUMMARY и Root.COLUMN_FLAGS. Каждый корень может поддерживать флаги: FLAG_SUPPORTS_CREATE, FLAG_SUPPORTS_SEARCH и FLAG_SUPPORTS_IS_CHILD.

Второй обязательный метод — queryChildDocuments, возвращающий дочерние документы указанного URI. Этот метод вызывается, когда пользователь открывает директорию в пикере. Каждый документ содержит колонки: Document.COLUMN_DOCUMENT_ID, COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE, COLUMN_SIZE и COLUMN_LAST_MODIFIED.

Обязательные методы DocumentsProvider

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

  • queryRoots — возвращает корневые точки входа в хранилище. Каждый корень представлен строкой в курсоре с ID, названием и иконкой.
  • queryDocument — возвращает один документ по его ID. Используется для получения информации о конкретном файле.
  • queryChildDocuments — возвращает дочерние документы для указанного URI родительской директории.
  • openDocument — открывает документ по ID и возвращает ParcelFileDescriptor для чтения или записи.

Дополнительно можно реализовать createDocument для создания новых файлов, deleteDocument для удаления и renameDocument для переименования. Эти методы требуют флага FLAG_SUPPORTS_CREATE в корне.

Регистрация провайдера в AndroidManifest

DocumentProvider регистрируется в AndroidManifest.xml как обычный ContentProvider с дополнительным intent-фильтром и флагами. Провайдер должен быть защищён от прямого доступа через permission — рекомендуется использовать android:exported="true" с явным permission.

xml
<provider
    android:name=".provider.CustomDocumentProvider"
    android:authorities="com.example.app.documents"
    android:exported="true"
    android:grantUriPermissions="true"
    android:permission="android.permission.MANAGE_DOCUMENTS">
    <intent-filter>
        <action
            android:name="android.content.action.DOCUMENTS_PROVIDER" />
    </intent-filter>
    <meta-data
        android:name="android.content.documents.roots"
        android:resource="@xml/file_paths" />
</provider>

Флаг grantUriPermissions позволяет SAF временно делегировать права доступа вызывающему приложению. Атрибут authorities должен быть уникальным — обычно используется package name с суффиксом .documents. Рекомендуется также указать meta-data с XML-ресурсом для настройки корней.

Пример кода: реализация DocumentsProvider

Реализация DocumentsProvider требует вернуть ParcelFileDescriptor из метода openDocument. Для локальных файлов используется ParcelFileDescriptor.open, для облачных — ParcelFileDescriptor.open с Pipe для потоковой передачи. Код должен обрабатывать ошибки доступа и отсутствия файлов.

kotlin
class CustomDocumentProvider : DocumentsProvider() {

    override fun queryRoots(): Cursor {
        val matrix = MatrixCursor(Root.COLUMNS)
        matrix.newRow().add(Root.COLUMN_ROOT_ID, "local")
            .add(Root.COLUMN_TITLE, "My Files")
            .add(Root.COLUMN_SUMMARY, "Local documents")
            .add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE)
        return matrix
    }

    override fun openDocument(
        documentId: String, flags: Int, cursor: CancellationSignal?
    ): ParcelFileDescriptor {
        val file = File(context.filesDir, documentId)
        val accessMode = ParcelFileDescriptor.parseMode(flags)
        return ParcelFileDescriptor.open(file, accessMode)
    }
}

Обработка виртуальных документов

DocumentProvider может возвращать виртуальные файлы — документы, не существующие как отдельные файлы на диске. Например, заметка из базы данных может быть представлена как виртуальный PDF. Для этого используется MIME-тип с флагом FLAG_VIRTUAL_DOCUMENT, а openDocument конвертирует данные в нужный формат перед отправкой.

DocumentProvider в iOS: UIDocumentPickerViewController

iOS имеет аналогичный механизм — UIDocumentPickerViewController, который также предоставляет единый интерфейс выбора файлов. Однако в iOS провайдер документов реализуется через UIDocumentPickerDelegate и расширения приложений (App Extensions) с типом Document Provider.

В отличие от Android DocumentsProvider, iOS UIDocumentPickerViewController не требует создания кастомного провайдера для локальных файлов — системный пикер поддерживает iCloud Drive и локальное хранилище по умолчанию. Сторонние облачные сервисы регистрируются через Document Provider extension с Info.plist ключом NSExtensionFileProviderDocumentInterface.

Основное различие: в Android DocumentProvider активно вызывается через SAF Intent и должен сам реализовать навигацию. В iOS UIDocumentPickerViewController использует встроенный системный браузер файлов, а провайдер расширения отвечает только за предоставление контента по запросу.

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

Что такое DocumentProvider в Android?

DocumentsProvider — это абстрактный класс Android для создания кастомного провайдера документов. Он позволяет приложению предоставлять свои файлы другим приложениям через системный диалог Storage Access Framework.

Какие методы обязательны в DocumentsProvider?

Обязательны четыре метода: queryRoots (корни хранилища), queryDocument (один документ), queryChildDocuments (содержимое папки) и openDocument (открытие файла). Без них провайдер не будет работать.

Как зарегистрировать DocumentProvider в AndroidManifest?

Провайдер регистрируется как <provider> с именем класса, уникальными authorities, intent-фильтром с действием android.content.action.DOCUMENTS_PROVIDER и grantUriPermissions="true".

Чем DocumentProvider отличается от FileProvider?

FileProvider генерирует content URI для конкретных файлов вашего приложения. DocumentsProvider создаёт полноценную файловую систему, видимую в SAF пикере, с поддержкой навигации и поиска.

Как создать виртуальный документ в DocumentProvider?

Используйте флаг FLAG_VIRTUAL_DOCUMENT в колонке COLUMN_FLAGS и MIME-тип с префиксом "vnd.android.document/". В openDocument конвертируйте данные в запрошенный формат через ParcelFileDescriptor с Pipe.

Итоги

  • DocumentsProvider — базовый класс Android для создания кастомного файлового провайдера, интегрируемого с Storage Access Framework.
  • queryRoots определяет корневые точки входа — вкладки с разными наборами файлов в системном пикере.
  • queryChildDocuments и queryDocument обеспечивают навигацию по виртуальной файловой системе провайдера.
  • openDocument возвращает ParcelFileDescriptor для чтения или записи файла по запросу SAF.
  • Регистрация в AndroidManifest требует intent-фильтра DOCUMENTS_PROVIDER и authorities.
  • Виртуальные документы позволяют предоставлять файлы, не существующие как отдельные файлы на диске — например, заметки из БД как PDF.
  • iOS аналог — UIDocumentPickerViewController с Document Provider extension для облачных хранилищ.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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