Storage Access Framework: wat is het, werkingsprincipes en toegang tot bestanden

Auteur: IT Sectr Gepubliceerd: 2026-07-10 Leestijd: 6 min

Storage Access Framework — is een Android-framework voor veilige toegang tot bestanden en documenten via het systeemdialoogvenster voor selectie. In plaats van het aanvragen van brede leesrechten voor de opslag, ontvangt de app een URI-link naar het door de gebruiker geselecteerde bestand. Volgens Android Developers (2026) ondersteunt SAF lokale opslag, clouddiensten Google Drive en Dropbox via DocumentProvider. Het framework is geïntroduceerd in Android 4.4 en werd de standaard voor het werken met documenten vanaf Android 10.

Belangrijkste punten

  • SAF — Android-framework voor het selecteren van bestanden via het systeemdialoogvenster zonder brede machtigingen.
  • URI-link vervangt het directe bestandspad: de app werkt met het bestand via content URI.
  • Persistent permissions maken het mogelijk de toegang tot het bestand te behouden na het herstarten van de app.
  • DocumentProvider breidt SAF uit voor toegang tot cloud- en aangepaste opslag.
  • Android 10 maakte SAF verplicht voor toegang tot bestanden buiten de sandbox van de app.

Wat is Storage Access Framework?

Storage Access Framework — is een onderdeel van de Android SDK dat een uniforme interface biedt voor het selecteren en maken van documenten via het systeemdialoogvenster. SAF abstraheert de fysieke locatie van bestanden: de app weet niet waar het bestand wordt gelezen — van de lokale schijf, Google Drive of Dropbox.

De architectuur van SAF omvat drie componenten: de client-app die het verzoek initieert, de systeemkiezer — het standaard dialoogvenster voor bestandsselectie, en DocumentProvider — een contentprovider die toegang tot bestanden van een specifieke opslag implementeert. De gebruiker ziet een uniforme interface, ongeacht de gegevensbron.

SAF is beschikbaar vanaf Android 4.4 (API 19). Aanvankelijk ondersteunde het framework alleen documenten, maar in Android 5.0 werd ondersteuning voor mappen toegevoegd via ACTION_OPEN_DOCUMENT_TREE. Vanaf Android 10 is SAF de aanbevolen manier geworden voor toegang tot elk bestand buiten de app-specific storage.

Hoe SAF werkt: systeemkiezer en URI

SAF start het systeemdialoogvenster voor bestandsselectie via een Intent met de actie ACTION_OPEN_DOCUMENT. De gebruiker ziet een lijst met beschikbare bronnen: intern geheugen, Google Drive, Dropbox en andere geregistreerde providers. Na het selecteren van het bestand retourneert het systeem een content URI met tijdelijke toegangsrechten.

Content URI heeft het formaat content://com.android.externalstorage.documents/document/primary/Download/file.pdf. In tegenstelling tot file:// URI, onthult content URI niet het werkelijke pad naar het bestand en werkt het via DocumentProvider. De app leest het bestand via ContentResolver.openInputStream op basis van de verkregen URI.

De systeemkiezer ondersteunt automatisch zoeken, sorteren en filteren van bestanden op MIME-typen. De ontwikkelaar geeft de benodigde typen op via Intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/pdf", "image/*")), en de kiezer toont alleen relevante bestanden.

Levenscyclus van URI-toegang

Standaard is de URI geldig tot het herstarten van de app of het opnieuw opstarten van het apparaat. Voor langdurige toegang vraagt de app takePersistableUriPermission aan — dit maakt het mogelijk het bestand bij volgende starts te lezen zonder opnieuw te selecteren via het dialoogvenster.

ACTION_OPEN_DOCUMENT en ACTION_CREATE_DOCUMENT

SAF biedt drie hoofdacties voor het werken met bestanden: openen, maken en selecteren van een mappenboom. ACTION_OPEN_DOCUMENT opent de systeemkiezer voor het selecteren van een bestaand bestand. ACTION_CREATE_DOCUMENT maakt een nieuw bestand — de gebruiker voert de naam in het dialoogvenster in en de app ontvangt een URI om naar te schrijven.

ACTION_OPEN_DOCUMENT_TREE maakt het mogelijk een volledige map te selecteren en toegang te krijgen tot alle bestanden erin. Dit wordt gebruikt in bestandsbeheerders, back-up- en synchronisatie-apps. De app ontvangt de URI van de map en kan de inhoud recursief doorlopen via DocumentFile.

ActieDoelVlag
ACTION_OPEN_DOCUMENTSelecteren van bestaand bestandREAD_FLAG
ACTION_CREATE_DOCUMENTMaken van nieuw bestandWRITE_FLAG
ACTION_OPEN_DOCUMENT_TREESelecteren van mapREAD + WRITE

Voor elke actie worden MIME-typen opgegeven via EXTRA_MIME_TYPES. Er kunnen meerdere typen worden opgegeven: "application/pdf", "image/*", "text/plain". Als er geen typen worden opgegeven, toont de kiezer alle bestanden.

Persistent URI permissions

Persistent URI permissions — een SAF-mechanisme dat het mogelijk maakt de toegang tot een bestand te behouden na afloop van de huidige sessie. Zonder deze vlag is de URI alleen geldig tot het herstarten van de app. De app vraagt de vlag FLAG_GRANT_PERSISTABLE_URI_PERMISSION aan samen met de READ- en WRITE-vlaggen.

Voor het behouden van rechten wordt de methode ContentResolver.takePersistableUriPermission gebruikt. Het systeem bewaart de URI in een speciaal register en herstelt de toegang bij de volgende start van de app. Om te controleren of de app persistente toegang tot een URI heeft, wordt ContentResolver.persistedUriPermissions gebruikt.

De gebruiker kan opgeslagen machtigingen intrekken via Instellingen → Apps → Machtigingen. De app moet het scenario afhandelen waarin de toegang tot het bestand onverwacht verdwijnt. Het wordt aanbevolen de toegang te controleren via ContentResolver.openInputStream voordat u begint met werken en SecurityException correct af te handelen.

Codevoorbeelden: bestand selecteren via SAF

SAF wordt gestart via een standaard Intent. De code is minimaal: maak een Intent met ACTION_OPEN_DOCUMENT, geef MIME-typen op en start via ActivityResultContracts.StartActivityForResult. Na het selecteren van het bestand ontvangt de callback de URI in data.data, die vervolgens wordt gebruikt om te lezen.

kotlin
val pickFile = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    result.data?.data?.let { uri ->
        val inputStream = contentResolver?.openInputStream(uri)
        // read from inputStream
    }
}

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
    addCategory(Intent.CATEGORY_OPENABLE)
    setType("application/pdf")
    putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
}
pickFile.launch(intent)

Bestand maken via ACTION_CREATE_DOCUMENT

Voor het schrijven van een nieuw bestand gebruikt u ACTION_CREATE_DOCUMENT. De Intent accepteert het MIME-type en de bestandsnaam via EXTRA_TITLE. Na het selecteren van een map en bevestiging retourneert de gebruiker een URI waar de app gegevens naartoe schrijft via ContentResolver.openOutputStream. Het systeem maakt automatisch het bestand aan op de geselecteerde locatie.

SAF vs READ_EXTERNAL_STORAGE

SAF verschilt van traditionele READ_EXTERNAL_STORAGE door een fundamenteel andere benadering van beveiliging. In plaats van toegang tot de hele opslag “in één keer” aan te vragen, vraagt SAF alleen toegang tot een specifiek bestand. Dit minimaliseert het aanvalsoppervlak en verhoogt het gebruikersvertrouwen.

READ_EXTERNAL_STORAGE geeft toegang tot alle bestanden op het apparaat, inclusief foto’s en documenten van andere apps. Op Android 10+ is deze benadering beperkt. SAF daarentegen biedt alleen toegang tot het door de gebruiker geselecteerde bestand en vereist expliciete bevestiging voor elk bestand. Gebruik MediaStore voor batchverwerking van media en SAF voor afzonderlijke documenten.

Het belangrijkste nadeel van SAF is dat elk bestand afzonderlijk moet worden geselecteerd. Voor bulkbewerkingen (back-ups, mapsynchronisatie) wordt ACTION_OPEN_DOCUMENT_TREE gebruikt, dat toegang geeft tot alle bestanden in de geselecteerde map. De oplossing hangt af van het scenario: SAF is optimaal voor gebruikersselectie, MediaStore voor programmatische toegang tot media.

Veelgestelde vragen

Wat is Storage Access Framework in Android?

Storage Access Framework — is een Android-framework voor veilige toegang tot bestanden via het systeemdialoogvenster voor selectie. De app ontvangt een content URI naar het geselecteerde bestand zonder brede leesrechten voor de opslag aan te vragen.

Hoe open ik een bestand via SAF?

Maak een Intent met ACTION_OPEN_DOCUMENT, geef het MIME-type op via setType en start via ActivityResultContracts. Ontvang in de callback de URI uit data.data en lees via ContentResolver.openInputStream.

Wat zijn persistent URI permissions?

Persistent URI permissions — is het mechanisme om toegang tot een URI te behouden na het herstarten van de app. Wordt aangevraagd via de vlag FLAG_GRANT_PERSISTABLE_URI_PERMISSION en de methode takePersistableUriPermission.

Welke MIME-typen ondersteunt SAF?

SAF ondersteunt alle MIME-typen: application/pdf, image/*, text/plain, application/zip en andere. Typen worden opgegeven via Intent.putExtra met de EXTRA_MIME_TYPES-array.

Wat is het verschil tussen SAF en MediaStore?

SAF is bedoeld voor het selecteren van afzonderlijke bestanden door de gebruiker via het systeemdialoogvenster. MediaStore biedt programmatische toegang tot alle mediabestanden van het apparaat via de mediadatabase zonder tussenkomst van de gebruiker.

Samenvatting

  • Storage Access Framework — Android-framework voor veilige bestandstoegang via de systeemkiezer zonder brede machtigingen.
  • Content URI vervangt bestandspaden: de app werkt met het bestand via DocumentProvider, niet via directe file://-links.
  • ACTION_OPEN_DOCUMENT opent een bestaand bestand, ACTION_CREATE_DOCUMENT maakt een nieuw bestand, ACTION_OPEN_DOCUMENT_TREE selecteert een map.
  • Persistent permissions behouden toegang tot URI na het herstarten van de app via takePersistableUriPermission.
  • Android 10 maakte SAF verplicht voor toegang tot bestanden buiten app-specific storage en beperkte READ_EXTERNAL_STORAGE.
  • DocumentProvider breidt SAF uit voor integratie van cloud- en aangepaste opslag.
  • Keuze tussen SAF en MediaStore hangt af van het scenario: SAF voor gebruikersselectie, MediaStore voor programmatische toegang tot media.

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.

Bespreek het project

Lees ook