Storage Access Framework — är ett Android-ramverk för säker åtkomst till filer och dokument via systemets dialogruta för val. Istället för att begära breda läsbehörigheter för lagring får appen en URI-länk till filen som användaren har valt. Enligt Android Developers (2026) stöder SAF lokal lagring, molntjänster Google Drive och Dropbox via DocumentProvider. Ramverket infördes i Android 4.4 och blev standarden för arbete med dokument från och med Android 10.
Huvudpunkter
Storage Access Framework — är en del av Android SDK som ger ett enhetligt gränssnitt för att välja och skapa dokument via systemdialogrutan. SAF abstraherar den fysiska platsen för filer: appen vet inte varifrån filen läses — från den lokala disken, Google Drive eller Dropbox.
Arkitekturen för SAF omfattar tre komponenter: klientappen som initierar begäran, systemväljaren — standarddialogrutan för filval, och DocumentProvider — innehållsleverantören som implementerar åtkomst till filer i en specifik lagring. Användaren ser ett enhetligt gränssnitt oavsett datakälla.
SAF är tillgängligt från Android 4.4 (API 19). Ursprungligen stödde ramverket endast dokument, men i Android 5.0 lades stöd för kataloger till via ACTION_OPEN_DOCUMENT_TREE. Från och med Android 10 blev SAF den rekommenderade metoden för åtkomst till alla filer utanför app-specific storage.
SAF startar systemets dialogruta för filval via en Intent med åtgärden ACTION_OPEN_DOCUMENT. Användaren ser en lista över tillgängliga källor: intern lagring, Google Drive, Dropbox och andra registrerade leverantörer. Efter att ha valt en fil returnerar systemet en content URI med tillfälliga åtkomsträttigheter.
Content URI har formatet content://com.android.externalstorage.documents/document/primary/Download/file.pdf. Till skillnad från file:// URI avslöjar content URI inte den verkliga sökvägen till filen och fungerar via DocumentProvider. Appen läser filen via ContentResolver.openInputStream baserat på den mottagna URI:n.
Systemväljaren stöder automatiskt sökning, sortering och filtrering av filer efter MIME-typer. Utvecklaren anger de nödvändiga typerna via Intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/pdf", "image/*")), och väljaren visar endast relevanta filer.
Som standard är URI:n giltig till omstart av appen eller omstart av enheten. För långsiktig åtkomst begär appen takePersistableUriPermission — detta gör det möjligt att läsa filen vid efterföljande start utan att välja om via dialogrutan.
SAF tillhandahåller tre huvudsakliga åtgärder för att arbeta med filer: öppna, skapa och välja mappträd. ACTION_OPEN_DOCUMENT öppnar systemväljaren för att välja en befintlig fil. ACTION_CREATE_DOCUMENT skapar en ny fil — användaren anger namnet i dialogrutan och appen får en URI för skrivning.
ACTION_OPEN_DOCUMENT_TREE gör det möjligt att välja en hel katalog och få åtkomst till alla filer i den. Det används i filhanterare, säkerhetskopierings- och synkroniseringsappar. Appen får katalogens URI och kan rekursivt lista innehållet via DocumentFile.
| Åtgärd | Syfte | Flagga |
|---|---|---|
| ACTION_OPEN_DOCUMENT | Välja befintlig fil | READ_FLAG |
| ACTION_CREATE_DOCUMENT | Skapa ny fil | WRITE_FLAG |
| ACTION_OPEN_DOCUMENT_TREE | Välja katalog | READ + WRITE |
För varje åtgärd anges MIME-typer via EXTRA_MIME_TYPES. Flera typer kan anges: "application/pdf", "image/*", "text/plain". Om inga typer anges visar väljaren alla filer.
Persistent URI permissions — SAF-mekanism som gör det möjligt att behålla åtkomst till filen efter att den aktuella sessionen avslutats. Utan denna flagga är URI:n endast giltig till omstart av appen. Appen begär flaggan FLAG_GRANT_PERSISTABLE_URI_PERMISSION tillsammans med READ- och WRITE-flaggorna.
För att behålla rättigheter används metoden ContentResolver.takePersistableUriPermission. Systemet lagrar URI:n i ett särskilt register och återställer åtkomsten vid nästa start av appen. För att kontrollera om appen har bestående åtkomst till URI:n används ContentResolver.persistedUriPermissions.
Användaren kan återkalla sparade behörigheter via Inställningar → Appar → Behörigheter. Appen bör hantera scenariot när åtkomsten till filen oväntat försvinner. Det rekommenderas att kontrollera åtkomst via ContentResolver.openInputStream innan arbetet påbörjas och korrekt hantera SecurityException.
SAF startas via en standard Intent. Koden är minimal: skapa en Intent med ACTION_OPEN_DOCUMENT, ange MIME-typer och starta via ActivityResultContracts.StartActivityForResult. Efter att ha valt filen får callback URI:n i data.data, som sedan används för läsning.
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)
För att skriva en ny fil använd ACTION_CREATE_DOCUMENT. Intent accepterar MIME-typen och filnamnet via EXTRA_TITLE. Efter att ha valt mapp och bekräftat returnerar användaren en URI där appen skriver data via ContentResolver.openOutputStream. Systemet skapar automatiskt filen på den valda platsen.
SAF skiljer sig från traditionell READ_EXTERNAL_STORAGE genom ett fundamentalt annorlunda synsätt på säkerhet. Istället för att begära åtkomst till hela lagringen "på en gång" begär SAF endast åtkomst till en specifik fil. Detta minimerar attackytan och ökar användarens förtroende.
READ_EXTERNAL_STORAGE ger åtkomst till alla filer på enheten, inklusive foton och dokument från andra appar. På Android 10+ är denna metod begränsad. SAF å andra sidan ger endast åtkomst till filen som användaren valt och kräver uttrycklig bekräftelse för varje fil. För batchhantering av media, använd MediaStore; för enskilda dokument, använd SAF.
Den största nackdelen med SAF är att varje fil måste väljas separat. För massoperationer (säkerhetskopiering, mappsynkronisering) används ACTION_OPEN_DOCUMENT_TREE som ger åtkomst till alla filer i den valda katalogen. Lösningen beror på scenariot: SAF är optimalt för användarval, MediaStore för programmatisk åtkomst till media.
Vanliga frågor
Storage Access Framework — är ett Android-ramverk för säker filåtkomst via systemets dialogruta för val. Appen får en content URI till den valda filen utan att begära breda läsbehörigheter för lagring.
Skapa en Intent med ACTION_OPEN_DOCUMENT, ange MIME-typen via setType och starta via ActivityResultContracts. I callback får du URI:n från data.data och läser via ContentResolver.openInputStream.
Persistent URI permissions — är mekanismen för att behålla åtkomst till URI:n efter omstart av appen. Begärs via flaggan FLAG_GRANT_PERSISTABLE_URI_PERMISSION och metoden takePersistableUriPermission.
SAF stöder alla MIME-typer: application/pdf, image/*, text/plain, application/zip och andra. Typer anges via Intent.putExtra med arrayen EXTRA_MIME_TYPES.
SAF är avsett för att välja enskilda filer av användaren via systemdialogrutan. MediaStore ger programmatisk åtkomst till alla mediefiler på enheten via mediedatabasen utan användarens medverkan.
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å