DocumentProvider — är en abstrakt Android-klass som implementerar en innehållsleverantör för åtkomst till filer via Storage Access Framework. Leverantören registreras i AndroidManifest.xml och tillhandahåller filer till andra appar via systemväljaren. Enligt Android Developers (2026) kräver DocumentsProvider implementering av metoderna queryRoots, queryDocument och queryChildDocuments för att visa filstrukturen i urvalsdialogrutan.
Huvudpunkter
DocumentsProvider — är en grundläggande Android-klass som ärver ContentProvider och gör det möjligt för en app att tillhandahålla sina filer till andra appar via SAF-systemgränssnittet. Leverantören skapar ett virtuellt filsystem som användaren ser i dialogrutan för dokumentval.
Varje leverantör organiserar filer i rötter (roots) — startpunkter på högsta nivå. Till exempel har Google Drive rötterna “Min disk” och “Delat med mig”. Inuti roten returnerar leverantören ett dokumentträd, där varje dokument är en fil eller katalog med en specifik MIME-typ, storlek och datum.
DocumentProvider är en del av paketet android.provider och är tillgängligt från och med Android 4.4 (API 19). Leverantören används av molntjänster, lösenordshanterare, anteckningsappar och alla program som lagrar filer i eget format.
Att skapa din egen DocumentProvider börjar med att ärva klassen DocumentsProvider och implementera fyra obligatoriska metoder. Leverantören bestämmer filstrukturen som visas i SAF-systemväljaren när du väljer filer.
Den första metoden — queryRoots, som returnerar en cursor med kolumnerna Root.COLUMN_ROOT_ID, Root.COLUMN_TITLE, Root.COLUMN_SUMMARY och Root.COLUMN_FLAGS. Varje rot kan stödja flaggorna: FLAG_SUPPORTS_CREATE, FLAG_SUPPORTS_SEARCH och FLAG_SUPPORTS_IS_CHILD.
Den andra obligatoriska metoden — queryChildDocuments, som returnerar underordnade dokument för den angivna URI:n. Denna metod anropas när användaren öppnar en katalog i väljaren. Varje dokument innehåller kolumnerna: Document.COLUMN_DOCUMENT_ID, COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE, COLUMN_SIZE och COLUMN_LAST_MODIFIED.
DocumentsProvider kräver implementering av fyra metoder som bildar filstrukturen för väljaren. Utan dem kommer leverantören inte att fungera — SAF-systemdialogrutan kommer inte att kunna visa filer.
Dessutom kan createDocument för att skapa nya filer, deleteDocument för borttagning och renameDocument för omdöpning implementeras. Dessa metoder kräver flaggan FLAG_SUPPORTS_CREATE i roten.
DocumentProvider registreras i AndroidManifest.xml som en vanlig ContentProvider med extra intent-filter och flaggor. Leverantören måste skyddas från direkt åtkomst via permission — det rekommenderas att använda android:exported="true" med explicit 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>
Flaggan grantUriPermissions gör det möjligt för SAF att tillfälligt delegera åtkomsträttigheter till den anropande appen. Attributet authorities måste vara unikt — vanligtvis används paketnamnet med suffixet .documents. Det rekommenderas också att ange meta-data med en XML-resurs för att konfigurera rötter.
Implementering av DocumentsProvider kräver att ParcelFileDescriptor returneras från metoden openDocument. För lokala filer används ParcelFileDescriptor.open, för molnfiler — ParcelFileDescriptor.open med Pipe för strömmande överföring. Koden måste hantera åtkomstfel och att filer saknas.
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 returnera virtuella filer — dokument som inte finns som separata filer på disken. Till exempel kan en anteckning från databasen presenteras som en virtuell PDF. För detta används MIME-typen med flaggan FLAG_VIRTUAL_DOCUMENT och openDocument konverterar data till det begärda formatet innan det skickas.
iOS har en liknande mekanism — UIDocumentPickerViewController, som också ger ett enhetligt gränssnitt för filval. I iOS implementeras dock dokumentleverantören via UIDocumentPickerDelegate och apptillägg (App Extensions) av typen Document Provider.
Till skillnad från Android DocumentsProvider kräver iOS UIDocumentPickerViewController ingen anpassad leverantör för lokala filer — systemväljaren stöder iCloud Drive och lokal lagring som standard. Molntjänster från tredje part registreras via Document Provider extension med Info.plist-nyckeln NSExtensionFileProviderDocumentInterface.
Huvudskillnaden: i Android anropas DocumentProvider aktivt via SAF Intent och måste själv implementera navigering. I iOS använder UIDocumentPickerViewController den inbyggda systemfilbläddraren och leverantörstillägget ansvarar endast för att tillhandahålla innehåll på begäran.
Vanliga frågor
DocumentsProvider — är en abstrakt Android-klass för att skapa en anpassad dokumentleverantör. Det gör det möjligt för en app att tillhandahålla sina filer till andra appar via systemdialogrutan Storage Access Framework.
Fyra metoder är obligatoriska: queryRoots (lagringsrötter), queryDocument (ett dokument), queryChildDocuments (mappinnehåll) och openDocument (öppna fil). Utan dem fungerar inte leverantören.
Leverantören registreras som <provider> med klassnamn, unika authorities, intent-filter med åtgärden android.content.action.DOCUMENTS_PROVIDER och grantUriPermissions="true".
FileProvider genererar innehålls-URI:er för specifika filer i din app. DocumentsProvider skapar ett komplett filsystem som är synligt i SAF-väljaren med stöd för navigering och sökning.
Använd flaggan FLAG_VIRTUAL_DOCUMENT i kolumnen COLUMN_FLAGS och MIME-typen med prefixet “vnd.android.document/”. I openDocument konverterar du data till det begärda formatet via ParcelFileDescriptor med Pipe.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också