Externí úložiště na mobilních zařízeních je vyměnitelné datové médium, ke kterému může získat přístup jakákoli aplikace s příslušnými oprávněními. Podle Android Open Source Project, 2026, od Androidu 10 Google zavedl Scoped Storage — model, který omezuje přímý přístup k souborovému systému a vyžaduje použití MediaStore API pro práci se společnými multimediálními soubory. Tento přístup zvyšuje bezpečnost uživatelských dat a zabraňuje úniku informací mezi aplikacemi.
Hlavní body
READ_EXTERNAL_STORAGE a WRITE_EXTERNAL_STORAGE jsou povinná pro Android 9 a nižšíExterní úložiště je oblast paměti, která není součástí chráněného sandboxu aplikace a je přístupná jiným programům. Na Androidu se pod tímto pojmem obvykle rozumí SD karta, ale k externímu úložišti patří také USB disky připojené přes OTG adaptér a cloudové disky integrované na úrovni souborového systému. Hlavní rozdíl od interního úložiště je absence izolace: soubory v externím úložišti může číst a upravovat jakákoli aplikace s příslušnými oprávněními.
Na Androidu je externí úložiště reprezentováno dvěma hlavními režimy: přenosné (portable) a interní (adoptable). Při formátování SD karty jako přenosného úložiště zůstává vyjímatelná a je formátována na FAT32 nebo exFAT. V režimu adoptable storage je karta formátována na ext4 a šifrována pomocí AES-128, poté ji systém vnímá jako rozšíření interní paměti. Režim adoptable je k dispozici od Androidu 6.0 Marshmallow, ale výrobci zařízení tuto možnost často ve svých firmwarech vypínají. Podle statistik Google Play Console pouze asi 12% Android zařízení podporuje adoptable storage, proto se nedoporučuje spoléhat na rozšíření interní paměti přes SD kartu jako jediné řešení.
Na iOS nejsou tradiční SD karty. Apple používá uzavřenou architekturu, kde veškeré úložiště stojí na interní flash paměti a iCloudu. Externí disky jsou podporovány přes Lightning nebo USB-C port, ale přístup k nim je omezen na systémového správce souborů Files a aplikace, které se integrují s Document Pickerem. Uživatel sám rozhoduje, které soubory otevře z externího zdroje — aplikace nemůže skenovat připojený disk bez výslovného souhlasu.
Výběr externího média závisí na požadavcích na rychlost, kapacitu a přenositelnost. Různé typy médií mají odlišné rychlostní charakteristiky, souborové systémy a scénáře použití v mobilních aplikacích.
| Typ média | Max. kapacita | Rychlost čtení | Souborový systém |
|---|---|---|---|
| SD UHS-I | 2 TB | až 104 MB/s | exFAT / FAT32 |
| SD UHS-II | 2 TB | až 312 MB/s | exFAT / FAT32 |
| USB 3.0 OTG | 2 TB | až 400 MB/s | exFAT / NTFS / FAT32 |
| USB-C SSD | 4 TB | až 1000 MB/s | exFAT / APFS / NTFS |
SD karty jsou klasifikovány podle rychlosti zápisu: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) a V90 (90 MB/s). Pro záznam 4K videa je vyžadována karta alespoň U3 nebo V30. Pro mobilní aplikace pracující s velkými multimediálními soubory (zpracování fotografií, střih videa) se doporučuje používat karty třídy U3 a vyšší. Rychlost karty přímo ovlivňuje výkon aplikace: záznam 4K videa na kartu Class 10 může způsobovat vynechávání snímků kvůli nedostatečné propustnosti. Při výběru SD karty pro aplikaci věnujte pozornost nejen třídě rychlosti, ale také hodnocení Application Performance Class: A1 a A2 udávají minimální výkon náhodného čtení a zápisu, který je kritický pro práci databází a mezipaměti aplikací.
USB-OTG (On-The-Go) umožňuje připojit k mobilnímu zařízení externí USB disky přes adaptér. Android podporuje OTG od verze 3.1, ale pro připojení disku je vyžadováno jádro s podporou souborového systému. FAT32 a exFAT jsou podporovány přímo, NTFS — pouze na zařízeních s vlastním jádrem nebo přes knihovnu Paragon. Na iOS se podpora USB disků objevila v iOS 13 spolu s aplikací Files. Pro práci s diskem musí aplikace používat UIDocumentPickerViewController, který poskytuje přístup pouze k souborům vybraným uživatelem — iOS neposkytuje plný přístup k souborovému systému disku.
Cloudové služby — iCloud, Google Drive, Dropbox — se mohou integrovat do souborového systému zařízení přes systémové poskytovatele. Na iOS je iCloud Drive součástí sandbox kontejneru aplikace a soubory se automaticky synchronizují mezi zařízeními uživatele. Na Androidu Google Drive poskytuje API pro čtení a zápis souborů, ale k přímému připojení do souborového systému nedochází. Pro mobilní aplikace pracující s velkými objemy dat může cloudové úložiště sloužit jako alternativa k SD kartě, zejména na zařízeních bez slotu pro rozšíření.
Práce s externím úložištěm na Androidu závisí na verzi operačního systému a modelu Scoped Storage. Proces přístupu k souborům se liší pro Android 9 a nižší, Android 10–12 a Android 13+.
Od Androidu 10 je hlavním způsobem přístupu ke společným multimediálním souborům MediaStore API. Toto API poskytuje jednotné rozhraní pro čtení a zápis obrázků, videí a zvukových souborů ve společném úložišti. Aplikace nevyžaduje oprávnění READ_EXTERNAL_STORAGE pro přístup k vlastním souborům, ale pro čtení souborů jiných aplikací je stále nutný výslovný souhlas uživatele. MediaStore automaticky indexuje multimediální soubory a poskytuje ContentResolver pro jejich dotazování.
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)
Po provedení dotazu získáte Cursor obsahující URI souborů. Pro čtení souboru otevřete InputStream přes contentResolver.openInputStream(uri). Zápis se provádí obdobně přes contentResolver.openOutputStream(uri). MediaStore automaticky zpracovává konflikty názvů a poskytuje možnost vkládání nových souborů přes contentResolver.insert(uri, values), který vrací URI vytvořeného souboru.
Storage Access Framework (SAF) — doporučený způsob přístupu k libovolným souborům na Android 10+. SAF poskytuje systémový dialog pro výběr souborů, přes který uživatel udělí aplikaci přístup ke konkrétnímu souboru nebo adresáři. Aplikace získá URI přístupu, které platí do restartu zařízení nebo do výslovného odvolání oprávnění v nastavení. SAF nevyžaduje oprávnění READ_EXTERNAL_STORAGE nebo WRITE_EXTERNAL_STORAGE, což zjednodušuje publikování v Google Play a snižuje počet žádostí o oprávnění.
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)
Na iOS se práce s externími soubory provádí přes UIDocumentPickerViewController, který uživatel otevře pro výběr konkrétních souborů nebo adresářů. Aplikace nemá přímý přístup k souborovému systému externího disku — pouze k těm souborům, které uživatel výslovně vybral. Po výběru souboru aplikace získá dočasnou URL adresu v sandbox kontejneru a může se souborem pracovat přes FileManager.
UIDocumentPickerViewController umožňuje uživateli vybrat jeden nebo více souborů z libovolného dostupného zdroje: iCloud Drive, připojeného USB disku, externí cloudové služby. Po výběru kontrolér vrátí pole URL adres, které může aplikace číst během relace. Pro zachování přístupu po zavření aplikace je nutné zavolat startAccessingSecurityScopedResource() a uložit security-scoped záložku do 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)
}
Parametr asCopy: true znamená, že iOS zkopíruje soubor do sandbox kontejneru aplikace a aplikace získá vlastní kopii nezávislou na původním souboru. Pokud zadáte asCopy: false, aplikace získá odkaz na původní soubor, ale pro přístup k němu je nutné zavolat url.startAccessingSecurityScopedResource(). Bez tohoto volání čtení souboru vyvolá výjimku. Po dokončení práce se souborem nezapomeňte zavolat url.stopAccessingSecurityScopedResource() pro uzavření zdroje a zabránění úniku deskriptorů.
Bezpečnost externího úložiště je nižší než u interního, protože soubory jsou přístupné jiným aplikacím. Jakákoli aplikace s oprávněním READ_EXTERNAL_STORAGE může přečíst všechny soubory na SD kartě, včetně těch, které vaše aplikace vytvořila pro dočasné ukládání citlivých údajů. Škodlivá aplikace může prohledat SD kartu a získat uživatelská data, pokud nejsou zašifrována. Proto se důrazně nedoporučuje ukládat autentizační tokeny, hesla nebo osobní údaje uživatele na externím úložišti v nezašifrované podobě.
Na Android 10+ Scoped Storage výrazně omezuje možnosti aplikací přistupovat ke společnému souborovému systému. Aplikace může bez oprávnění číst pouze soubory, které sama vytvořila, a pro přístup k souborům jiných aplikací je vyžadován výslovný souhlas uživatele přes SAF dialog. Toto omezení se však nevztahuje na aplikace s cílovou verzí SDK nižší než 29 — ty nadále fungují podle starého modelu, což představuje riziko pro uživatele, kteří své aplikace neaktualizovali. Google Play od roku 2021 vyžaduje targetSdkVersion 29+ pro všechny nové i aktualizované aplikace.
Formátování a šifrování — další důležitý aspekt bezpečnosti. SD karta naformátovaná jako přenosné úložiště není systémem standardně šifrována. I při použití adoptable storage se šifrování aktivuje pouze tehdy, pokud výrobce zařízení tuto možnost zapnul ve firmwaru. Pro ochranu citlivých dat ukládaných na externí úložiště použijte knihovnu EncryptedFile z AndroidX Security, která šifruje každý soubor samostatně pomocí AES256-GCM, nezávisle na systémovém šifrování.
Efektivní použití externího úložiště vyžaduje rovnováhu mezi dostupností dat a bezpečností. Dodržujte následující pravidla pro zajištění spolehlivého ukládání uživatelských souborů.
Environment.getExternalStorageState() pro kontrolu stavu SD karty. Karta může být vyjmuta, poškozena nebo nedostupná pro zápisJe důležité si uvědomit, že externí úložiště nezaručuje zachování dat při poruchách. SD karty mají omezený počet přepisovacích cyklů, zejména levnější modely třídy Class 4 a Class 6. Při intenzivním zápisu (například logování nebo ukládání do mezipaměti streamovaných dat) může karta selhat během několika měsíců. Pro takové scénáře používejte interní paměť nebo cloudové úložiště a na externím úložišti uchovávejte pouze soubory, jejichž ztrátu uživatel považuje za přijatelnou. Pravidelně kontrolujte stav SD karty přes StatFs a informujte uživatele o kritických chybách souborového systému.
Často kladené otázky
Na Android 13+ bylo oprávnění READ_EXTERNAL_STORAGE nahrazeno podrobnějšími: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO a READ_MEDIA_AUDIO. Pro přístup k jiným typům souborů použijte SAF.
Ano, funkce adoptable storage je k dispozici na Android 6.0+. Karta je naformátována na ext4 s šifrováním AES-128. Mnoho výrobců však tuto možnost vypíná a přibližně 88% zařízení adoptable storage nepodporuje.
Použijte metodu Environment.getExternalStorageState(), která vrací řetězec stavu. Hodnota MEDIA_MOUNTED znamená, že karta je k dispozici pro čtení i zápis. Jiné hodnoty indikují chyby nebo nepřítomnost karty.
Scoped Storage omezuje aplikaci na její vlastní kontejner a sdílené mediální knihovny MediaStore. Plný přístup umožňuje čtení libovolných souborů na zařízení. Scoped Storage zvyšuje bezpečnost uživatelských dat a je povinný pro nové aplikace.
Spusťte Intent s akcí ACTION_OPEN_DOCUMENT_TREE, která otevře systémový dialog pro výběr adresáře. Po výběru získáte URI oprávnění platné do restartu. Uložte toto URI do SharedPreferences pro pozdější použití.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také