Externe opslag op mobiele apparaten is een verwisselbaar gegevensmedium dat door elke app met de juiste machtigingen kan worden benaderd. Volgens Android Open Source Project, 2026, vanaf Android 10 heeft Google Scoped Storage geïntroduceerd — een model dat directe toegang tot het bestandssysteem beperkt en het gebruik van MediaStore API vereist voor het werken met gedeelde mediabestanden. Deze aanpak verhoogt de beveiliging van gebruikersgegevens en voorkomt informatielekken tussen apps.
Belangrijkste punten
READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE zijn verplicht voor Android 9 en lagerExterne opslag — is een geheugengebied dat niet binnen de beveiligde sandbox van de app valt en toegankelijk is voor andere programma’s. Op Android verwijst deze term meestal naar de SD-kaart, maar externe opslag omvat ook USB-schijven aangesloten via een OTG-adapter en cloud-schijven geïntegreerd op bestandssysteemniveau.
Op Android wordt externe opslag gepresenteerd in twee hoofdmodi: draagbaar (portable) en intern (adoptable). Bij het formatteren van een SD-kaart als draagbare opslag blijft deze verwijderbaar en wordt deze geformatteerd in FAT32 of exFAT. In de adoptable storage-modus wordt de kaart geformatteerd in ext4 en versleuteld met AES-128, waarna het systeem deze beschouwt als een uitbreiding van het interne geheugen. De adoptable-modus is beschikbaar vanaf Android 6.0 Marshmallow, maar fabrikanten schakelen deze optie vaak uit in hun firmware. Volgens Google Play Console-statistieken ondersteunt slechts ongeveer 12% van de Android-apparaten adoptable storage, dus het wordt afgeraden om te vertrouwen op uitbreiding van het interne geheugen via een SD-kaart als enige optie.
Op iOS zijn er geen traditionele SD-kaarten. Apple gebruikt een gesloten architectuur waarbij alle opslag is gebaseerd op intern flashgeheugen en iCloud. Externe schijven worden ondersteund via de Lightning- of USB-C-poort, maar de toegang is beperkt tot de systeembestandsbeheerder Files en apps die integreren met Document Picker. De gebruiker beslist zelf welke bestanden uit een externe bron worden geopend — de app kan de aangesloten schijf niet scannen zonder expliciete toestemming.
Keuze van externe media hangt af van de vereisten voor snelheid, capaciteit en draagbaarheid. Verschillende soorten media hebben verschillende snelheidskenmerken, bestandssystemen en gebruiksscenario’s in mobiele apps.
| Mediatype | Max. capaciteit | Leessnelheid | Bestandssysteem |
|---|---|---|---|
| SD UHS-I | 2 TB | tot 104 MB/s | exFAT / FAT32 |
| SD UHS-II | 2 TB | tot 312 MB/s | exFAT / FAT32 |
| USB 3.0 OTG | 2 TB | tot 400 MB/s | exFAT / NTFS / FAT32 |
| USB-C SSD | 4 TB | tot 1000 MB/s | exFAT / APFS / NTFS |
SD-kaarten worden geclassificeerd op schrijfsnelheid: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) en V90 (90 MB/s). Voor het opnemen van 4K-video is een kaart van ten minste U3 of V30 vereist. Voor mobiele apps die met grote mediabestanden werken (fotoverwerking, videobewerking), wordt het gebruik van kaarten van klasse U3 en hoger aanbevolen. De snelheid van de kaart heeft direct invloed op de prestaties van de app: het opnemen van 4K-video op een Class 10-kaart kan frames overslaan vanwege onvoldoende bandbreedte. Bij het kiezen van een SD-kaart voor een app moet u niet alleen letten op de snelheidsklasse, maar ook op de Application Performance Class-classificatie: A1 en A2 geven de minimale willekeurige lees- en schrijfprestaties aan, die cruciaal zijn voor databases en app-cache.
USB-OTG (On-The-Go) maakt het mogelijk externe USB-schijven via een adapter op een mobiel apparaat aan te sluiten. Android ondersteunt OTG vanaf versie 3.1, maar voor het mounten van de schijf is een kernel vereist die het bestandssysteem ondersteunt. FAT32 en exFAT worden standaard ondersteund, NTFS — alleen op apparaten met een aangepaste kernel of via de Paragon-bibliotheek. Op iOS verscheen ondersteuning voor USB-schijven in iOS 13 samen met de app Files. Om met de schijf te werken, moet de app UIDocumentPickerViewController gebruiken, die alleen toegang geeft tot door de gebruiker geselecteerde bestanden — iOS biedt geen volledige toegang tot het bestandssysteem van de schijf.
Clouddiensten — iCloud, Google Drive, Dropbox — kunnen via systeemproviders worden geïntegreerd in het bestandssysteem van het apparaat. Op iOS maakt iCloud Drive deel uit van de Sandbox-container van de app en worden bestanden automatisch gesynchroniseerd tussen de apparaten van de gebruiker. Op Android biedt Google Drive een API voor het lezen en schrijven van bestanden, maar er vindt geen directe montage in het bestandssysteem plaats. Voor mobiele apps die met grote hoeveelheden gegevens werken, kan cloudopslag dienen als alternatief voor een SD-kaart, vooral op apparaten zonder uitbreidingssleuf.
Werken met externe opslag op Android hangt af van de versie van het besturingssysteem en het Scoped Storage-model. Het proces van toegang tot bestanden verschilt voor Android 9 en lager, Android 10–12 en Android 13+.
Vanaf Android 10, de belangrijkste manier om toegang te krijgen tot gedeelde mediabestanden is MediaStore API. Deze API biedt een uniforme interface voor het lezen en schrijven van afbeeldingen, video’s en audiobestanden in de gedeelde opslag. De app heeft geen READ_EXTERNAL_STORAGE-machtiging nodig voor toegang tot eigen bestanden, maar voor het lezen van bestanden van andere apps is nog steeds expliciete toestemming van de gebruiker vereist. MediaStore indexeert automatisch mediabestanden en biedt ContentResolver om ze op te vragen.
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)
Na het uitvoeren van de query ontvangt u een Cursor met de URI’s van de bestanden. Open voor het lezen van een bestand een InputStream via contentResolver.openInputStream(uri). Schrijven gebeurt op dezelfde manier via contentResolver.openOutputStream(uri). MediaStore verwerkt automatisch naamconflicten en biedt de mogelijkheid om nieuwe bestanden in te voegen via contentResolver.insert(uri, values), die de URI van het aangemaakte bestand retourneert.
Storage Access Framework (SAF) — aanbevolen methode voor toegang tot willekeurige bestanden op Android 10+. SAF biedt een systeemdialoog voor bestandsselectie, waarmee de gebruiker de app toegang geeft tot een specifiek bestand of map. De app ontvangt een toegangs-URI die geldig is tot het apparaat opnieuw wordt opgestart of tot de machtiging expliciet wordt ingetrokken via instellingen. SAF vereist geen READ_EXTERNAL_STORAGE- of WRITE_EXTERNAL_STORAGE-machtigingen, wat publicatie in Google Play vereenvoudigt en het aantal machtigingsverzoeken vermindert.
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)
Op iOS werkt externe bestanden via UIDocumentPickerViewController, die de gebruiker opent om specifieke bestanden of mappen te selecteren. De app heeft geen directe toegang tot het bestandssysteem van de externe schijf — alleen tot bestanden die de gebruiker expliciet heeft geselecteerd. Na selectie van een bestand ontvangt de app een tijdelijk URL-adres in de Sandbox-container en kan met het bestand werken via FileManager.
UIDocumentPickerViewController stelt de gebruiker in staat om een of meerdere bestanden te selecteren uit elke beschikbare bron: iCloud Drive, aangesloten USB-schijf, externe clouddienst. Na selectie retourneert de controller een reeks URL’s die de app tijdens de sessie kan lezen. Om de toegang te behouden na het sluiten van de app, moet startAccessingSecurityScopedResource() worden aangeroepen en een beveiligde bookmark worden opgeslagen in 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)
}
Parameter asCopy: true betekent dat iOS het bestand naar de Sandbox-container van de app kopieert en de app een eigen kopie ontvangt, onafhankelijk van het originele bestand. Als asCopy: false wordt opgegeven, ontvangt de app een verwijzing naar het originele bestand, maar voor toegang moet url.startAccessingSecurityScopedResource() worden aangeroepen. Zonder deze aanroep zal het lezen van het bestand een uitzondering veroorzaken. Na het voltooien van het werk met het bestand, roept u zeker url.stopAccessingSecurityScopedResource() aan om de bron te sluiten en lekkage van descriptors te voorkomen.
Beveiliging van externe opslag is lager dan die van Internal Storage, omdat bestanden toegankelijk zijn voor andere apps. Elke app met READ_EXTERNAL_STORAGE-machtiging kan alle bestanden op de SD-kaart lezen, inclusief bestanden die uw app heeft aangemaakt voor tijdelijke opslag van vertrouwelijke gegevens. Een kwaadaardige app kan de SD-kaart scannen en gebruikersgegevens extraheren als deze niet zijn versleuteld. Daarom wordt het ten zeerste afgeraden om authenticatietokens, wachtwoorden of persoonlijke gebruikersgegevens in externe opslag in ongecodeerde vorm op te slaan.
Op Android 10+ Scoped Storage beperkt de mogelijkheden van apps om toegang te krijgen tot het gedeelde bestandssysteem aanzienlijk. De app kan zonder machtiging alleen bestanden lezen die hij zelf heeft aangemaakt, en voor toegang tot bestanden van andere apps is expliciete toestemming van de gebruiker vereist via de SAF-dialoog. Deze beperking geldt echter niet voor apps met een doel-SDK-versie lager dan 29 — ze blijven werken volgens het oude model, wat een risico vormt voor gebruikers die hun apps niet hebben bijgewerkt. Google Play vereist sinds 2021 targetSdkVersion 29+ voor alle nieuwe en bijgewerkte apps.
Formatteren en versleutelen — nog een belangrijk beveiligingsaspect. Een SD-kaart die is geformatteerd als draagbare opslag wordt standaard niet door het systeem versleuteld. Zelfs bij gebruik van adoptable storage wordt versleuteling alleen geactiveerd als de fabrikant deze optie in de firmware heeft ingeschakeld. Gebruik de bibliotheek EncryptedFile uit AndroidX Security, die elk bestand afzonderlijk versleutelt met AES256-GCM, onafhankelijk van systeemversleuteling.
Effectief gebruik van externe opslag vereist een balans tussen beschikbaarheid van gegevens en beveiliging. Houd u aan de volgende regels om een betrouwbare opslag van gebruikersbestanden te garanderen.
Environment.getExternalStorageState() om de status van de SD-kaart te controleren. De kaart kan zijn verwijderd, beschadigd of niet beschikbaar voor schrijvenHet is belangrijk te onthouden dat externe opslag de gegevensintegriteit bij storingen niet garandeert. SD-kaarten hebben een beperkt aantal herschrijfcycli, vooral budgetmodellen van klasse Class 4 en Class 6. Bij intensief schrijven (bijvoorbeeld loggen of cachen van streaminggegevens) kan de kaart binnen enkele maanden defect raken. Gebruik voor dergelijke scenario’s intern geheugen of cloudopslag en bewaar op externe opslag alleen bestanden waarvan de gebruiker het verlies acceptabel vindt. StatFs en informeer de gebruiker over kritieke bestandssysteemfouten.
Veelgestelde vragen
Op Android 13+ de machtiging READ_EXTERNAL_STORAGE is vervangen door meer granulaire: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO en READ_MEDIA_AUDIO. Gebruik SAF voor toegang tot andere bestandstypen.
Ja, de functie adoptable storage is beschikbaar op Android 6.0+. De kaart wordt geformatteerd in ext4 met AES-128-versleuteling. Veel fabrikanten schakelen deze optie echter uit en ongeveer 88% van de apparaten ondersteunt geen adoptable storage.
Gebruik de methode Environment.getExternalStorageState(), die een statusreeks retourneert. De waarde MEDIA_MOUNTED betekent dat de kaart beschikbaar is voor lezen en schrijven. Andere waarden duiden op fouten of afwezigheid van de kaart.
Scoped Storage beperkt de app tot zijn eigen container en de gedeelde MediaStore-mediatheek. Volledige toegang staat het lezen van elk bestand op het apparaat toe. van gebruikersgegevens en is verplicht voor nieuwe apps.
Start een Intent met de actie ACTION_OPEN_DOCUMENT_TREE, die een systeemdialoog voor mapselectie opent. Na selectie ontvangt u een URI-machtiging die geldig is tot herstart. Sla deze URI op in SharedPreferences voor later gebruik.
Samenvatting
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.
Lees ook