DocumentProvider — egy absztrakt Android osztály, amely content-provider-t valósít meg a fájlok eléréséhez a Storage Access Frameworkön keresztül. A szolgáltató regisztrálása az AndroidManifest.xml-ben történik, és a rendszerválasztón keresztül biztosít fájlokat más alkalmazásoknak. Az Android Developers (2026) szerint a DocumentsProvider megköveteli a queryRoots, queryDocument és queryChildDocuments metódusok implementálását a fájlszerkezet megjelenítéséhez a kiválasztási párbeszédablakban.
Főbb pontok
DocumentsProvider — egy alap Android osztály, amely örökli a ContentProvider-t és lehetővé teszi egy alkalmazás számára, hogy fájljait más alkalmazásoknak biztosítsa a SAF rendszerfelületén keresztül. A szolgáltató egy virtuális fájlrendszert hoz létre, amelyet a felhasználó a dokumentumkiválasztási párbeszédablakban lát.
Minden szolgáltató gyökerekbe (roots) — legfelső szintű belépési pontokba rendezi a fájlokat. Például a Google Drive rendelkezik a „Saját lemez" és a „Megosztva velem" gyökerekkel. A gyökérben a szolgáltató egy dokumentumfát ad vissza, ahol minden dokumentum egy fájl vagy könyvtár meghatározott MIME-típussal, mérettel és dátumokkal.
A DocumentProvider az android.provider csomag része, és Android 4.4-től (API 19) érhető el. A szolgáltatót felhőszolgáltatások, jelszókezelők, jegyzetalkalmazások és minden olyan program használja, amely saját formátumban tárol fájlokat.
Létrehozása a saját DocumentProvider-nek a DocumentsProvider osztály öröklésével és négy kötelező metódus implementálásával kezdődik. A szolgáltató meghatározza a fájlszerkezetet, amely a SAF rendszerválasztójában jelenik meg fájlok kiválasztásakor.
Az első metódus — queryRoots, amely egy kurzort ad vissza a Root.COLUMN_ROOT_ID, Root.COLUMN_TITLE, Root.COLUMN_SUMMARY és Root.COLUMN_FLAGS oszlopokkal. Minden gyökér támogathatja a FLAG_SUPPORTS_CREATE, FLAG_SUPPORTS_SEARCH és FLAG_SUPPORTS_IS_CHILD jelzőket.
A második kötelező metódus — queryChildDocuments, amely visszaadja a megadott URI gyermekdokumentumait. Ezt a metódust akkor hívják meg, amikor a felhasználó megnyit egy könyvtárat a választóban. Minden dokumentum tartalmazza a Document.COLUMN_DOCUMENT_ID, COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE, COLUMN_SIZE és COLUMN_LAST_MODIFIED oszlopokat.
DocumentsProvider négy metódus implementálását követeli meg, amelyek a fájlszerkezetet alkotják a választó számára. Nélkülük a szolgáltató nem fog működni — a SAF rendszer párbeszédablaka nem tudja megjeleníteni a fájlokat.
Ezenkívül implementálható a createDocument új fájlok létrehozásához, a deleteDocument törléshez és a renameDocument átnevezéshez. Ezek a metódusok a FLAG_SUPPORTS_CREATE jelzőt igénylik a gyökérben.
DocumentProvider regisztrálása az AndroidManifest.xml-ben egy szokásos ContentProvider-ként történik, további intent-filterrel és jelzőkkel. A szolgáltatót védeni kell a közvetlen hozzáféréstől permission segítségével — ajánlott az android:exported="true" használata explicit permission-nel.
<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>
A grantUriPermissions jelző lehetővé teszi a SAF számára, hogy ideiglenesen delegálja a hozzáférési jogokat a hívó alkalmazásnak. Az authorities attribútumnak egyedinek kell lennie — általában a csomagnév .documents utótaggal használatos. Ajánlott továbbá meta-data megadása XML erőforrással a gyökerek konfigurálásához.
Implementálása a DocumentsProvider-nek megköveteli a ParcelFileDescriptor visszaadását az openDocument metódusból. Helyi fájlokhoz ParcelFileDescriptor.open, felhőfájlokhoz ParcelFileDescriptor.open Pipe-pal a streamelt átvitelhez használatos. A kódnak kezelnie kell a hozzáférési hibákat és a fájlok hiányát.
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)
}
}
A DocumentProvider visszaadhat virtuális fájlokat — olyan dokumentumokat, amelyek nem léteznek különálló fájlként a lemezen. Például egy adatbázisbeli jegyzet virtuális PDF-ként jeleníthető meg. Ehhez a MIME-típust a FLAG_VIRTUAL_DOCUMENT jelzővel használják, és az openDocument átalakítja az adatokat a kért formátumba a küldés előtt.
iOS hasonló mechanizmussal rendelkezik — UIDocumentPickerViewController, amely szintén egységes fájlkiválasztási felületet biztosít. Az iOS-ben azonban a dokumentumszolgáltató a UIDocumentPickerDelegate és az alkalmazáskiterjesztések (App Extensions) segítségével valósul meg Document Provider típussal.
Az Android DocumentsProvider-rel ellentétben az iOS UIDocumentPickerViewController nem igényel egyéni szolgáltató létrehozását helyi fájlokhoz — a rendszerválasztó alapértelmezés szerint támogatja az iCloud Drive-ot és a helyi tárhelyet. A harmadik féltől származó felhőszolgáltatások a Document Provider extension segítségével regisztrálnak az Info.plist NSExtensionFileProviderDocumentInterface kulccsal.
A fő különbség: Androidban a DocumentProvider aktívan meghívásra kerül a SAF Intent-en keresztül, és magának kell megvalósítania a navigációt. iOS-ben az UIDocumentPickerViewController a beépített rendszerfájl-böngészőt használja, és a szolgáltató kiterjesztése csak a tartalom igény szerinti biztosításáért felelős.
Gyakran Ismételt Kérdések
DocumentsProvider — egy absztrakt Android osztály egyéni dokumentumszolgáltató létrehozásához. Lehetővé teszi egy alkalmazás számára, hogy fájljait más alkalmazásoknak biztosítsa a Storage Access Framework rendszer párbeszédablakán keresztül.
Négy metódus kötelező: queryRoots (a tároló gyökerei), queryDocument (egy dokumentum), queryChildDocuments (mappa tartalma) és openDocument (fájl megnyitása). Nélkülük a szolgáltató nem fog működni.
A szolgáltató <provider> ként regisztrálódik az osztály nevével, egyedi authorities-szel, a android.content.action.DOCUMENTS_PROVIDER művelettel rendelkező intent-filterrel és grantUriPermissions="true".
FileProvider content URI-kat generál az alkalmazás konkrét fájljaihoz. DocumentsProvider egy teljes fájlrendszert hoz létre, amely látható a SAF választóban, navigációs és keresési támogatással.
Használja a FLAG_VIRTUAL_DOCUMENT jelzőt a COLUMN_FLAGS oszlopban és a MIME-típust a „vnd.android.document/" előtaggal. Az openDocument-ben konvertálja az adatokat a kért formátumba ParcelFileDescriptor segítségével Pipe-pal.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is