Extern lagring på mobila enheter är ett flyttbart datamedium som alla appar med rätt behörigheter kan komma åt. Enligt Android Open Source Project, 2026, från och med Android 10 införde Google Scoped Storage — en modell som begränsar direkt åtkomst till filsystemet och kräver användning av MediaStore API för att arbeta med gemensamma mediafiler. Detta tillvägagångssätt ökar säkerheten för användardata och förhindrar informationsläckage mellan appar.
Huvudpunkter
READ_EXTERNAL_STORAGE och WRITE_EXTERNAL_STORAGE är obligatoriska för Android 9 och lägreExtern lagring är ett minnesområde som inte ingår i appens skyddade sandlåda och är tillgängligt för andra program. På Android avses vanligtvis SD-kort med denna term, men extern lagring omfattar även USB-enheter anslutna via OTG-adapter och moln-enheter integrerade på filsystemnivå. Huvudskillnaden från intern lagring är avsaknaden av isolering: filer i extern lagring kan läsas och ändras av vilken app som helst med lämpliga behörigheter.
På Android presenteras extern lagring i två huvudlägen: portabel (portable) och intern (adoptable). Vid formatering av SD-kort som portabel lagring förblir det flyttbart och formateras till FAT32 eller exFAT. I adoptable storage-läge formateras kortet till ext4 och krypteras med AES-128, varefter systemet uppfattar det som en förlängning av det interna minnet. Adoptable-läget är tillgängligt från Android 6.0 Marshmallow, men tillverkare av enheter inaktiverar ofta denna funktion i sina firmware. Enligt Google Play Console-statistik stöder endast cirka 12% av Android-enheterna adoptable storage, så det rekommenderas inte att förlita sig enbart på utökning av internt minne via SD-kort som enda alternativ.
På iOS finns inga traditionella SD-kort. Apple använder en sluten arkitektur där all lagring bygger på internt flashminne och iCloud. Extern enheter stöds via Lightning eller USB-C-port, men åtkomsten är begränsad till systemets filhanterare Files och appar som integreras med Document Picker. Användaren bestämmer själv vilka filer som ska öppnas från extern källa — appen kan inte skanna den anslutna enheten utan uttryckligt medgivande.
Valet av externt medium beror på kraven på hastighet, kapacitet och portabilitet. Olika typer av media har olika hastighetsegenskaper, filsystem och användningsscenarier i mobilappar.
| Mediatyp | Max kapacitet | Läshastighet | Filsystem |
|---|---|---|---|
| SD UHS-I | 2 TB | upp till 104 MB/s | exFAT / FAT32 |
| SD UHS-II | 2 TB | upp till 312 MB/s | exFAT / FAT32 |
| USB 3.0 OTG | 2 TB | upp till 400 MB/s | exFAT / NTFS / FAT32 |
| USB-C SSD | 4 TB | upp till 1000 MB/s | exFAT / APFS / NTFS |
SD-kort klassificeras efter skrivhastighet: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) och V90 (90 MB/s). För inspelning av 4K-video krävs ett kort på minst U3 eller V30. För mobilappar som arbetar med stora mediafiler (fotoredigering, videoredigering) rekommenderas kort av klass U3 och högre. Kortets hastighet påverkar direkt appens prestanda: inspelning av 4K-video på ett Class 10-kort kan orsaka bildrutehopp på grund av otillräcklig bandbredd. När du väljer SD-kort för din app, var uppmärksam inte bara på hastighetsklassen utan även på Application Performance Class-betyget: A1 och A2 anger minsta prestanda för slumpmässig läsning och skrivning, vilket är kritiskt för databaser och app-cache.
USB-OTG (On-The-Go) gör det möjligt att ansluta externa USB-enheter till mobila enheter via en adapter. Android stöder OTG från version 3.1, men för att montera enheten krävs en kärna med stöd för filsystemet. FAT32 och exFAT stöds inbyggt, NTFS — endast på enheter med anpassad kärna eller via Paragon-biblioteket. På iOS kom stöd för USB-enheter i iOS 13 tillsammans med appen Files. För att arbeta med enheten måste appen använda UIDocumentPickerViewController, som ger åtkomst endast till filer som användaren valt — iOS ger inte full åtkomst till enhetens filsystem.
Molntjänster — iCloud, Google Drive, Dropbox — kan integreras i enhetens filsystem via systemleverantörer. På iOS är iCloud Drive en del av appens sandlådebehållare och filer synkroniseras automatiskt mellan användarens enheter. På Android tillhandahåller Google Drive API för läsning och skrivning av filer, men ingen direkt montering i filsystemet sker. För mobilappar som arbetar med stora datamängder kan molnlagring fungera som ett alternativ till SD-kort, särskilt på enheter utan expansionsplats.
Arbete med extern lagring på Android beror på operativsystemets version och Scoped Storage-modellen. Processen för filåtkomst skiljer sig för Android 9 och lägre, Android 10–12 och Android 13+.
Från och med Android 10 är det huvudsakliga sättet att komma åt gemensamma mediafiler via MediaStore API. Detta API tillhandahåller ett enhetligt gränssnitt för läsning och skrivning av bilder, videor och ljudfiler i gemensam lagring. Appen kräver inte behörigheten READ_EXTERNAL_STORAGE för åtkomst till egna filer, men för läsning av andra appars filer krävs fortfarande uttryckligt användartillstånd. MediaStore indexerar automatiskt mediafiler och tillhandahåller ContentResolver för att söka efter dem.
val collection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
} else {
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
}
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME
)
val cursor = contentResolver.query(collection, projection, null, null, null)
Efter att ha utfört frågan får du en Cursor som innehåller filernas URI:er. För att läsa filen öppnar du en InputStream via contentResolver.openInputStream(uri). Skrivning görs på liknande sätt via contentResolver.openOutputStream(uri). MediaStore hanterar automatiskt namnkonflikter och ger möjlighet att infoga nya filer via contentResolver.insert(uri, values), som returnerar URI för den skapade filen.
Storage Access Framework (SAF) — det rekommenderade sättet att komma åt godtyckliga filer på Android 10+. SAF tillhandahåller en systemdialog för filval, genom vilken användaren ger appen åtkomst till en specifik fil eller katalog. Appen får en åtkomst-URI som gäller tills enheten startas om eller tills behörigheten uttryckligen återkallas via inställningarna. SAF kräver inte behörigheterna READ_EXTERNAL_STORAGE eller WRITE_EXTERNAL_STORAGE, vilket förenklar publicering i Google Play och minskar antalet behörighetsförfrågningar.
val requestCode = 42
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
startActivityForResult(intent, requestCode)
På iOS sker arbete med externa filer via UIDocumentPickerViewController, som användaren öppnar för att välja specifika filer eller kataloger. Appen har inte direkt åtkomst till den externa enhetens filsystem — endast till de filer som användaren uttryckligen valt. Efter filval får appen en tillfällig URL i sandlådebehållaren och kan arbeta med filen via FileManager.
UIDocumentPickerViewController låter användaren välja en eller flera filer från valfri tillgänglig källa: iCloud Drive, ansluten USB-enhet, extern molntjänst. Efter val returnerar kontrollen en array med URL:er som appen kan läsa under sessionen. För att behålla åtkomsten efter att appen stängts måste du anropa startAccessingSecurityScopedResource() och spara ett security-scoped bokmärke i UserDefaults.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.data, .image],
asCopy: true
)
picker.delegate = self
func documentPicker(
controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
let data = try Data(contentsOf: url)
}
Parametern asCopy: true innebär att iOS kopierar filen till appens sandlådebehållare och appen får en egen kopia oberoende av originalfilen. Om du anger asCopy: false får appen en referens till originalfilen, men för åtkomst måste du anropa url.startAccessingSecurityScopedResource(). Utan detta anrop kommer filläsning att orsaka ett undantag. Efter att ha arbetat klart med filen, anropa url.stopAccessingSecurityScopedResource() för att stänga resursen och förhindra läckage av deskriptorer.
Säkerheten för extern lagring är lägre än för intern lagring eftersom filerna är tillgängliga för andra appar. Alla appar med behörigheten READ_EXTERNAL_STORAGE kan läsa alla filer på SD-kortet, inklusive de som din app skapade för tillfällig lagring av känslig data. En skadlig app kan skanna SD-kortet och extrahera användardata om de inte är krypterade. Därför rekommenderas det starkt att inte lagra autentiseringstoken, lösenord eller personlig användardata på extern lagring i okrypterad form.
På Android 10+ begränsar Scoped Storage avsevärt appars möjligheter att komma åt det gemensamma filsystemet. Appen kan utan tillstånd endast läsa filer som den själv skapat, och för åtkomst till andra appars filer krävs uttryckligt användarmedgivande via SAF-dialog. Denna begränsning gäller dock inte appar med mål-SDK-version lägre än 29 — de fortsätter att fungera enligt den gamla modellen, vilket skapar risk för användare som inte uppdaterat sina appar. Google Play har sedan 2021 krav på targetSdkVersion 29+ för alla nya och uppdaterade appar.
Formatering och kryptering — ytterligare en viktig säkerhetsaspekt. Ett SD-kort formaterat som portabel lagring krypteras inte av systemet som standard. Även vid användning av adoptable storage aktiveras kryptering endast om enhetstillverkaren har aktiverat denna funktion i firmware. För att skydda känslig data som lagras på extern lagring, använd biblioteket EncryptedFile från AndroidX Security, som krypterar varje fil separat med AES256-GCM, oberoende av systemkryptering.
Effektiv användning av extern lagring kräver balans mellan datatillgänglighet och säkerhet. Följ dessa regler för att säkerställa tillförlitlig lagring av användarfiler.
Environment.getExternalStorageState() för att kontrollera SD-kortets status. Kortet kan vara borttaget, skadat eller inte tillgängligt för skrivningDet är viktigt att komma ihåg att extern lagring inte garanterar databevarande vid fel. SD-kort har begränsad livslängd för skrivcykler, särskilt billigare modeller av Class 4 och Class 6. Vid intensiv skrivning (t.ex. loggning eller cachning av strömmande data) kan kortet gå sönder inom några månader. För sådana scenarier, använd internt minne eller molnlagring, och på extern lagring spara endast filer vars förlust användaren anser acceptabel. Kontrollera regelbundet SD-kortets status via StatFs och informera användaren om kritiska filsystemfel.
Vanliga frågor
På Android 13+ har behörigheten READ_EXTERNAL_STORAGE ersatts av mer detaljerade: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO och READ_MEDIA_AUDIO. För åtkomst till andra filtyper, använd SAF.
Ja, funktionen adoptable storage finns tillgänglig på Android 6.0+. Kortet formateras till ext4 med AES-128-kryptering. Men många tillverkare inaktiverar detta alternativ, och cirka 88% av enheterna stöder inte adoptable storage.
Använd metoden Environment.getExternalStorageState(), som returnerar en statussträng. Värdet MEDIA_MOUNTED innebär att kortet är tillgängligt för läsning och skrivning. Andra värden indikerar fel eller att kortet saknas.
Scoped Storage begränsar appen till dess egen behållare och gemensamma MediaStore-mediebibliotek. Full åtkomst tillåter läsning av alla filer på enheten. Scoped Storage ökar säkerheten för användardata och är obligatoriskt för nya appar.
Starta ett Intent med åtgärden ACTION_OPEN_DOCUMENT_TREE, som öppnar systemets katalogvalsdialog. Efter val får du en URI-behörighet som gäller till omstart. Spara denna URI i SharedPreferences för framtida användning.
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å