DocumentProvider — ce este, crearea furnizorului și lucrul cu fișiere

Autor: IT Sectr Publicat: 2026-07-10 Timp de citire: 6 min

DocumentProvider — este o clasă abstractă Android care implementează content-provider pentru accesul la fișiere prin Storage Access Framework. Furnizorul este înregistrat în AndroidManifest.xml și oferă fișiere altor aplicații prin selectorul de sistem. Conform Android Developers (2026), DocumentsProvider necesită implementarea metodelor queryRoots, queryDocument și queryChildDocuments pentru afișarea structurii fișierelor în dialogul de selectare.

Principalele

  • DocumentsProvider — clasă abstractă pentru crearea unui furnizor de fișiere personalizat în Android.
  • Depozite — furnizorul poate conecta fișiere locale, servicii cloud și documente virtuale.
  • queryRoots — metodă obligatorie care returnează directoarele rădăcină ale depozitului.
  • queryChildDocuments — returnează conținutul directorului pentru navigare în selector.
  • Înregistrare în AndroidManifest cu intent-filter android.content.action.DOCUMENTS_PROVIDER.

Ce este DocumentProvider?

DocumentsProvider — este o clasă de bază Android care moștenește ContentProvider și permite aplicației să își ofere fișierele altor aplicații prin interfața de sistem SAF. Furnizorul creează un sistem de fișiere virtual pe care utilizatorul îl vede în dialogul de selectare a documentelor.

Fiecare furnizor organizează fișierele în rădăcini (roots) — puncte de intrare de nivel superior. De exemplu, Google Drive are rădăcinile „Discul meu” și „Partajate cu mine”. În interiorul rădăcinii, furnizorul returnează un arbore de documente, unde fiecare document este un fișier sau director cu un tip MIME, dimensiune și date specifice.

DocumentProvider face parte din pachetul android.provider și este disponibil începând cu Android 4.4 (API 19). Furnizorul este utilizat de servicii cloud, manageri de parole, aplicații de notițe și orice programe care stochează fișiere în format propriu.

Cum să creați un DocumentProvider personalizat

Crearea propriului DocumentProvider începe cu moștenirea clasei DocumentsProvider și implementarea a patru metode obligatorii. Furnizorul definește structura fișierelor care este afișată în selectorul de sistem SAF la selectarea fișierelor.

Prima metodă — queryRoots, care returnează un cursor cu coloanele Root.COLUMN_ROOT_ID, Root.COLUMN_TITLE, Root.COLUMN_SUMMARY și Root.COLUMN_FLAGS. Fiecare rădăcină poate suporta flagurile: FLAG_SUPPORTS_CREATE, FLAG_SUPPORTS_SEARCH și FLAG_SUPPORTS_IS_CHILD.

A doua metodă obligatorie — queryChildDocuments, care returnează documentele copil pentru URI-ul specificat. Această metodă este apelată când utilizatorul deschide un director în selector. Fiecare document conține coloanele: Document.COLUMN_DOCUMENT_ID, COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE, COLUMN_SIZE și COLUMN_LAST_MODIFIED.

Metodele obligatorii ale DocumentsProvider

DocumentsProvider necesită implementarea a patru metode care formează structura fișierelor pentru selector. Fără ele, furnizorul nu va funcționa — dialogul de sistem SAF nu va putea afișa fișierele.

  • queryRoots — returnează punctele de intrare rădăcină în depozit. Fiecare rădăcină este reprezentată de un rând în cursor cu ID, nume și pictogramă.
  • queryDocument — returnează un document după ID-ul său. Folosit pentru a obține informații despre un fișier specific.
  • queryChildDocuments — returnează documentele copil pentru URI-ul directorului părinte specificat.
  • openDocument — deschide documentul după ID și returnează ParcelFileDescriptor pentru citire sau scriere.

Suplimentar, se pot implementa createDocument pentru crearea de fișiere noi, deleteDocument pentru ștergere și renameDocument pentru redenumire. Aceste metode necesită flagul FLAG_SUPPORTS_CREATE în rădăcină.

Înregistrarea furnizorului în AndroidManifest

DocumentProvider se înregistrează în AndroidManifest.xml ca un ContentProvider obișnuit cu intent-filter și flaguri suplimentare. Furnizorul trebuie protejat de accesul direct prin permission — se recomandă utilizarea android:exported="true" cu permission explicit.

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>

Flagul grantUriPermissions permite SAF să delegheze temporar drepturile de acces aplicației apelante. Atributul authorities trebuie să fie unic — de obicei se folosește numele pachetului cu sufixul .documents. Se recomandă, de asemenea, specificarea meta-data cu resursă XML pentru configurarea rădăcinilor.

Exemplu de cod: implementarea DocumentsProvider

Implementarea DocumentsProvider necesită returnarea ParcelFileDescriptor din metoda openDocument. Pentru fișierele locale se folosește ParcelFileDescriptor.open, pentru cele cloud — ParcelFileDescriptor.open cu Pipe pentru transmitere în flux. Codul trebuie să gestioneze erorile de acces și absența fișierelor.

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

Gestionarea documentelor virtuale

DocumentProvider poate returna fișiere virtuale — documente care nu există ca fișiere separate pe disc. De exemplu, o notă din baza de date poate fi prezentată ca un PDF virtual. Pentru aceasta se folosește tipul MIME cu flagul FLAG_VIRTUAL_DOCUMENT, iar openDocument convertește datele în formatul solicitat înainte de trimitere.

DocumentProvider în iOS: UIDocumentPickerViewController

iOS are un mecanism similar — UIDocumentPickerViewController, care oferă, de asemenea, o interfață unificată de selectare a fișierelor. Cu toate acestea, în iOS, furnizorul de documente este implementat prin UIDocumentPickerDelegate și extensii de aplicații (App Extensions) cu tipul Document Provider.

Spre deosebire de Android DocumentsProvider, iOS UIDocumentPickerViewController nu necesită crearea unui furnizor personalizat pentru fișiere locale — selectorul de sistem suportă iCloud Drive și stocarea locală în mod implicit. Serviciile cloud terțe se înregistrează prin Document Provider extension cu cheia Info.plist NSExtensionFileProviderDocumentInterface.

Diferența principală: în Android, DocumentProvider este apelat activ prin SAF Intent și trebuie să implementeze singur navigarea. În iOS, UIDocumentPickerViewController folosește navigatorul de fișiere de sistem încorporat, iar extensia furnizorului răspunde doar pentru furnizarea conținutului la cerere.

Întrebări frecvente

Ce este DocumentProvider în Android?

DocumentsProvider — este o clasă abstractă Android pentru crearea unui furnizor de documente personalizat. Permite aplicației să își ofere fișierele altor aplicații prin dialogul de sistem Storage Access Framework.

Ce metode sunt obligatorii în DocumentsProvider?

Patru metode sunt obligatorii: queryRoots (rădăcinile depozitului), queryDocument (un document), queryChildDocuments (conținutul folderului) și openDocument (deschiderea fișierului). Fără ele, furnizorul nu va funcționa.

Cum se înregistrează DocumentProvider în AndroidManifest?

Furnizorul se înregistrează ca <provider> cu numele clasei, authorities unice, intent-filter cu acțiunea android.content.action.DOCUMENTS_PROVIDER și grantUriPermissions="true".

Cu ce se deosebește DocumentProvider de FileProvider?

FileProvider generează URI de conținut pentru fișiere specifice ale aplicației dvs. DocumentsProvider creează un sistem de fișiere complet vizibil în selectorul SAF, cu suport pentru navigare și căutare.

Cum se creează un document virtual în DocumentProvider?

Folosiți flagul FLAG_VIRTUAL_DOCUMENT în coloana COLUMN_FLAGS și tipul MIME cu prefixul „vnd.android.document/". În openDocument, convertiți datele în formatul solicitat prin ParcelFileDescriptor cu Pipe.

Concluzii

  • DocumentsProvider — clasă de bază Android pentru crearea unui furnizor de fișiere personalizat integrat cu Storage Access Framework.
  • queryRoots definește punctele de intrare rădăcină — file cu diferite seturi de fișiere în selectorul de sistem.
  • queryChildDocuments și queryDocument asigură navigarea prin sistemul de fișiere virtual al furnizorului.
  • openDocument returnează ParcelFileDescriptor pentru citirea sau scrierea fișierului la cererea SAF.
  • Înregistrarea în AndroidManifest necesită intent-filter DOCUMENTS_PROVIDER și authorities.
  • Documentele virtuale permit furnizarea de fișiere care nu există ca fișiere separate pe disc — de exemplu, note din baza de date ca PDF.
  • Analog în iOS — UIDocumentPickerViewController cu Document Provider extension pentru stocări cloud.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și