DocumentProvider — is een abstracte Android-klasse die een contentprovider implementeert voor toegang tot bestanden via Storage Access Framework. De provider wordt geregistreerd in AndroidManifest.xml en biedt bestanden aan andere apps via de systeemkiezer. Volgens Android Developers (2026) vereist DocumentsProvider implementatie van de methoden queryRoots, queryDocument en queryChildDocuments om de bestandsstructuur weer te geven in het selectiedialoogvenster.
Belangrijkste
DocumentsProvider — is een basis-Android-klasse die ContentProvider erft en een app in staat stelt zijn bestanden aan andere apps aan te bieden via de SAF-systeeminterface. De provider creëert een virtueel bestandssysteem dat de gebruiker ziet in het dialoogvenster voor documentselectie.
Elke provider organiseert bestanden in wortels (roots) — toegangspunten op hoog niveau. Google Drive heeft bijvoorbeeld de wortels „Mijn schijf" en „Gedeeld met mij". Binnen een wortel retourneert de provider een documentenboom, waarbij elk document een bestand of map is met een specifiek MIME-type, grootte en datums.
DocumentProvider maakt deel uit van het android.provider-pakket en is beschikbaar vanaf Android 4.4 (API 19). De provider wordt gebruikt door clouddiensten, wachtwoordmanagers, notitie-apps en alle programma's die bestanden in eigen formaat opslaan.
Het maken van uw eigen DocumentProvider begint met het overerven van de klasse DocumentsProvider en het implementeren van vier verplichte methoden. De provider bepaalt de bestandsstructuur die wordt weergegeven in de SAF-systeemkiezer bij het selecteren van bestanden.
De eerste methode — queryRoots, die een cursor retourneert met de kolommen Root.COLUMN_ROOT_ID, Root.COLUMN_TITLE, Root.COLUMN_SUMMARY en Root.COLUMN_FLAGS. Elke wortel kan vlaggen ondersteunen: FLAG_SUPPORTS_CREATE, FLAG_SUPPORTS_SEARCH en FLAG_SUPPORTS_IS_CHILD.
De tweede verplichte methode — queryChildDocuments, die onderliggende documenten van de opgegeven URI retourneert. Deze methode wordt aangeroepen wanneer de gebruiker een map opent in de kiezer. Elk document bevat de kolommen: Document.COLUMN_DOCUMENT_ID, COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE, COLUMN_SIZE en COLUMN_LAST_MODIFIED.
DocumentsProvider vereist implementatie van vier methoden die de bestandsstructuur voor de kiezer vormen. Zonder hen werkt de provider niet — het SAF-systeemdialoogvenster kan geen bestanden weergeven.
Daarnaast kunnen createDocument voor het maken van nieuwe bestanden, deleteDocument voor verwijderen en renameDocument voor hernoemen worden geïmplementeerd. Deze methoden vereisen de vlag FLAG_SUPPORTS_CREATE in de wortel.
DocumentProvider wordt geregistreerd in AndroidManifest.xml als een gewone ContentProvider met extra intent-filter en vlaggen. De provider moet worden beschermd tegen directe toegang via permission — het wordt aanbevolen android:exported="true" te gebruiken met expliciete permission.
<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>
De vlag grantUriPermissions stelt SAF in staat tijdelijk toegangsrechten te delegeren aan de aanroepende app. Het attribuut authorities moet uniek zijn — meestal wordt de pakketnaam met het achtervoegsel .documents gebruikt. Het wordt ook aanbevolen om meta-data met een XML-bron op te geven voor het configureren van wortels.
Implementatie van DocumentsProvider vereist het retourneren van ParcelFileDescriptor uit de methode openDocument. Voor lokale bestanden wordt ParcelFileDescriptor.open gebruikt, voor cloudbestanden — ParcelFileDescriptor.open met Pipe voor streaming. De code moet toegangsfouten en het ontbreken van bestanden afhandelen.
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 kan virtuele bestanden retourneren — documenten die niet als afzonderlijke bestanden op schijf bestaan. Een notitie uit de database kan bijvoorbeeld worden gepresenteerd als een virtuele PDF. Hiervoor wordt het MIME-type met de vlag FLAG_VIRTUAL_DOCUMENT gebruikt, en openDocument converteert de gegevens naar het gevraagde formaat voordat het wordt verzonden.
iOS heeft een vergelijkbaar mechanisme — UIDocumentPickerViewController, dat ook een uniforme bestandsselectie-interface biedt. In iOS wordt de documentprovider echter geïmplementeerd via UIDocumentPickerDelegate en app-extensies (App Extensions) van het type Document Provider.
In tegenstelling tot Android DocumentsProvider vereist iOS UIDocumentPickerViewController geen aangepaste provider voor lokale bestanden — de systeemkiezer ondersteunt standaard iCloud Drive en lokale opslag. Clouddiensten van derden registreren zich via Document Provider extension met de Info.plist-sleutel NSExtensionFileProviderDocumentInterface.
Het belangrijkste verschil: in Android wordt DocumentProvider actief aangeroepen via SAF Intent en moet het zelf navigatie implementeren. In iOS gebruikt UIDocumentPickerViewController de ingebouwde systeembestandsbrowser en is de providerextensie alleen verantwoordelijk voor het leveren van inhoud op verzoek.
Veelgestelde vragen
DocumentsProvider — is een abstracte Android-klasse voor het maken van een aangepaste documentprovider. Hiermee kan een app zijn bestanden aan andere apps aanbieden via het systeemdialoogvenster Storage Access Framework.
Vier methoden zijn verplicht: queryRoots (opslagwortels), queryDocument (één document), queryChildDocuments (mapinhoud) en openDocument (bestand openen). Zonder hen werkt de provider niet.
De provider wordt geregistreerd als <provider> met de klassenaam, unieke authorities, intent-filter met de actie android.content.action.DOCUMENTS_PROVIDER en grantUriPermissions="true".
FileProvider genereert content-URI's voor specifieke bestanden van uw app. DocumentsProvider creëert een volledig bestandssysteem dat zichtbaar is in de SAF-kiezer, met ondersteuning voor navigatie en zoeken.
Gebruik de vlag FLAG_VIRTUAL_DOCUMENT in de kolom COLUMN_FLAGS en het MIME-type met het voorvoegsel „vnd.android.document/". Converteer in openDocument de gegevens naar het gevraagde formaat via ParcelFileDescriptor met Pipe.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook