DocumentProvider — co to jest, tworzenie dostawcy i praca z plikami

Autor: IT Sectr Opublikowano: 2026-07-10 Czas czytania: 6 min

DocumentProvider — to abstrakcyjna klasa Androida implementująca content provider do dostępu do plików przez Storage Access Framework. Dostawca jest rejestrowany w AndroidManifest.xml i udostępnia pliki innym aplikacjom przez systemowy selektor. Według Android Developers (2026), DocumentsProvider wymaga implementacji metod queryRoots, queryDocument i queryChildDocuments do wyświetlania struktury plików w oknie wyboru.

Najważniejsze

  • DocumentsProvider — abstrakcyjna klasa do tworzenia niestandardowego dostawcy plików w Android.
  • Magazyny — dostawca może podłączać pliki lokalne, usługi w chmurze i wirtualne dokumenty.
  • queryRoots — obowiązkowa metoda zwracająca katalogi główne magazynu.
  • queryChildDocuments — zwraca zawartość katalogu do nawigacji w selektorze.
  • Rejestracja w AndroidManifest z intent-filter android.content.action.DOCUMENTS_PROVIDER.

Co to jest DocumentProvider?

DocumentsProvider — to podstawowa klasa Androida dziedzicząca po ContentProvider, która pozwala aplikacji udostępniać swoje pliki innym aplikacjom przez systemowy interfejs SAF. Dostawca tworzy wirtualny system plików widoczny dla użytkownika w oknie wyboru dokumentów.

Każdy dostawca organizuje pliki w korzenie (roots) — punkty wejścia najwyższego poziomu. Na przykład Google Drive ma korzenie „Mój dysk” i „Udostępnione mi”. Wewnątrz korzenia dostawca zwraca drzewo dokumentów, gdzie każdy dokument to plik lub katalog z określonym typem MIME, rozmiarem i datami.

DocumentProvider wchodzi w skład pakietu android.provider i jest dostępny od Androida 4.4 (API 19). Dostawca jest używany przez usługi w chmurze, menedżery haseł, aplikacje notatek i wszelkie programy przechowujące pliki we własnym formacie.

Jak stworzyć niestandardowy DocumentProvider

Tworzenie własnego DocumentProvider zaczyna się od dziedziczenia klasy DocumentsProvider i implementacji czterech obowiązkowych metod. Dostawca określa strukturę plików wyświetlaną w systemowym selektorze SAF przy wyborze plików.

Pierwsza metoda — queryRoots, która zwraca kursor z kolumnami Root.COLUMN_ROOT_ID, Root.COLUMN_TITLE, Root.COLUMN_SUMMARY i Root.COLUMN_FLAGS. Każdy korzeń może obsługiwać flagi: FLAG_SUPPORTS_CREATE, FLAG_SUPPORTS_SEARCH i FLAG_SUPPORTS_IS_CHILD.

Druga obowiązkowa metoda — queryChildDocuments, zwracająca dokumenty podrzędne dla określonego URI. Ta metoda jest wywoływana, gdy użytkownik otwiera katalog w selektorze. Każdy dokument zawiera kolumny: Document.COLUMN_DOCUMENT_ID, COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE, COLUMN_SIZE i COLUMN_LAST_MODIFIED.

Obowiązkowe metody DocumentsProvider

DocumentsProvider wymaga implementacji czterech metod, które tworzą strukturę plików dla selektora. Bez nich dostawca nie będzie działać — systemowy dialog SAF nie będzie mógł wyświetlić plików.

  • queryRoots — zwraca korzeniowe punkty wejścia do magazynu. Każdy korzeń jest reprezentowany przez wiersz w kursorze z ID, nazwą i ikoną.
  • queryDocument — zwraca jeden dokument po jego ID. Używany do uzyskania informacji o konkretnym pliku.
  • queryChildDocuments — zwraca dokumenty podrzędne dla określonego URI katalogu nadrzędnego.
  • openDocument — otwiera dokument po ID i zwraca ParcelFileDescriptor do odczytu lub zapisu.

Dodatkowo można zaimplementować createDocument do tworzenia nowych plików, deleteDocument do usuwania i renameDocument do zmiany nazwy. Te metody wymagają flagi FLAG_SUPPORTS_CREATE w korzeniu.

Rejestracja dostawcy w AndroidManifest

DocumentProvider jest rejestrowany w AndroidManifest.xml jako zwykły ContentProvider z dodatkowym intent-filter i flagami. Dostawca musi być chroniony przed bezpośrednim dostępem przez permission — zaleca się użycie android:exported="true" z jawnym 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>

Flaga grantUriPermissions pozwala SAF tymczasowo delegować prawa dostępu wywołującej aplikacji. Atrybut authorities musi być unikalny — zwykle używa się nazwy pakietu z sufiksem .documents. Zaleca się również określenie meta-data z zasobem XML do konfiguracji korzeni.

Przykład kodu: implementacja DocumentsProvider

Implementacja DocumentsProvider wymaga zwrócenia ParcelFileDescriptor z metody openDocument. Dla plików lokalnych używa się ParcelFileDescriptor.open, dla chmurowych — ParcelFileDescriptor.open z Pipe do przesyłania strumieniowego. Kod musi obsługiwać błędy dostępu i braku plików.

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)
    }
}

Obsługa wirtualnych dokumentów

DocumentProvider może zwracać wirtualne pliki — dokumenty, które nie istnieją jako osobne pliki na dysku. Na przykład notatka z bazy danych może być przedstawiona jako wirtualny PDF. W tym celu używa się typu MIME z flagą FLAG_VIRTUAL_DOCUMENT, a openDocument konwertuje dane do wymaganego formatu przed wysłaniem.

DocumentProvider w iOS: UIDocumentPickerViewController

iOS ma podobny mechanizm — UIDocumentPickerViewController, który również zapewnia jednolity interfejs wyboru plików. Jednak w iOS dostawca dokumentów jest implementowany przez UIDocumentPickerDelegate i rozszerzenia aplikacji (App Extensions) z typem Document Provider.

W przeciwieństwie do Android DocumentsProvider, iOS UIDocumentPickerViewController nie wymaga tworzenia niestandardowego dostawcy dla plików lokalnych — systemowy selektor obsługuje iCloud Drive i lokalne magazyny domyślnie. Zewnętrzne usługi w chmurze rejestrują się przez Document Provider extension z kluczem Info.plist NSExtensionFileProviderDocumentInterface.

Główna różnica: w Android DocumentProvider jest aktywnie wywoływany przez SAF Intent i musi sam zaimplementować nawigację. W iOS UIDocumentPickerViewController używa wbudowanej systemowej przeglądarki plików, a rozszerzenie dostawcy odpowiada tylko za dostarczanie treści na żądanie.

Często zadawane pytania

Co to jest DocumentProvider w Android?

DocumentsProvider — to abstrakcyjna klasa Androida do tworzenia niestandardowego dostawcy dokumentów. Pozwala aplikacji udostępniać swoje pliki innym aplikacjom przez systemowy dialog Storage Access Framework.

Jakie metody są obowiązkowe w DocumentsProvider?

Obowiązkowe są cztery metody: queryRoots (korzenie magazynu), queryDocument (jeden dokument), queryChildDocuments (zawartość folderu) i openDocument (otwarcie pliku). Bez nich dostawca nie będzie działać.

Jak zarejestrować DocumentProvider w AndroidManifest?

Dostawca jest rejestrowany jako <provider> z nazwą klasy, unikalnymi authorities, intent-filter z akcją android.content.action.DOCUMENTS_PROVIDER i grantUriPermissions="true".

Czym DocumentProvider różni się od FileProvider?

FileProvider generuje content URI dla konkretnych plików twojej aplikacji. DocumentsProvider tworzy pełnoprawny system plików widoczny w selektorze SAF, z obsługą nawigacji i wyszukiwania.

Jak utworzyć wirtualny dokument w DocumentProvider?

Użyj flagi FLAG_VIRTUAL_DOCUMENT w kolumnie COLUMN_FLAGS i typu MIME z prefiksem „vnd.android.document/”. W openDocument konwertuj dane do żądanego formatu przez ParcelFileDescriptor z Pipe.

Podsumowanie

  • DocumentsProvider — podstawowa klasa Androida do tworzenia niestandardowego dostawcy plików zintegrowanego z Storage Access Framework.
  • queryRoots określa korzeniowe punkty wejścia — zakładki z różnymi zestawami plików w systemowym selektorze.
  • queryChildDocuments i queryDocument zapewniają nawigację po wirtualnym systemie plików dostawcy.
  • openDocument zwraca ParcelFileDescriptor do odczytu lub zapisu pliku na żądanie SAF.
  • Rejestracja w AndroidManifest wymaga intent-filter DOCUMENTS_PROVIDER i authorities.
  • Wirtualne dokumenty pozwalają udostępniać pliki, które nie istnieją jako osobne pliki na dysku — na przykład notatki z bazy danych jako PDF.
  • Odpowiednik w iOS — UIDocumentPickerViewController z Document Provider extension dla magazynów w chmurze.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również