A külső tároló mobileszközökön egy cserélhető adathordozó, amelyhez a megfelelő engedélyekkel rendelkező alkalmazások hozzáférhetnek. A Android Open Source Project, 2026 adatai szerint a Google az Android 10-től kezdve bevezette a Scoped Storage modellt, amely korlátozza a közvetlen hozzáférést a fájlrendszerhez, és a MediaStore API használatát követeli meg a közös médiafájlok kezeléséhez. Ez a megközelítés növeli a felhasználói adatok biztonságát és megakadályozza az információszivárgást az alkalmazások között.
Főbb pontok
READ_EXTERNAL_STORAGE és WRITE_EXTERNAL_STORAGE kötelezőek Android 9 és az alatti verziókhozKülső tároló — olyan memóriaterület, amely nem része az alkalmazás védett homokozójának, és más programok számára is elérhető. Androidon ezen a kifejezésen általában SD-kártyát értenek, de a külső tárolóhoz tartoznak az OTG-adapteren keresztül csatlakoztatott USB-meghajtók és a fájlrendszer szintjén integrált felhőmeghajtók is. A fő különbség a belső tárolóval szemben az izoláció hiánya: a külső tárolóban lévő fájlokat bármely, a megfelelő engedélyekkel rendelkező alkalmazás olvashatja és módosíthatja.
Androidon a külső tároló két fő módban jelenik meg: hordozható (portable) és belső (adoptable). Az SD-kártya hordozható tárolóként történő formázásakor az cserélhető marad, és FAT32 vagy exFAT formátumba kerül formázásra. Adoptable storage módban a kártya ext4 formátumba kerül, és AES-128 titkosítással van ellátva, ezután a rendszer a belső memória kiterjesztéseként érzékeli. Az adoptable mód az Android 6.0 Marshmallow-tól érhető el, de a készülékgyártók gyakran kikapcsolják ezt a lehetőséget a saját rendszerképeikben. A Google Play Console statisztikái szerint csak az Android-eszközök körülbelül 12%-a támogatja az adoptable storage-t, ezért nem ajánlott kizárólag az SD-kártyán keresztüli belső memória-bővítésre hagyatkozni.
iOS-en nincsenek hagyományos SD-kártyák. Az Apple zárt architektúrát használ, ahol minden tárolás a belső flash memóriára és az iCloudra épül. Külső meghajtók a Lightning vagy USB-C porton keresztül támogatottak, de a hozzáférés korlátozott a rendszer Files fájlkezelőjére és azokra az alkalmazásokra, amelyek integrálódnak a Document Pickerrel. A felhasználó dönti el, mely fájlokat nyitja meg külső forrásból — az alkalmazás nem szkennelheti a csatlakoztatott meghajtót a felhasználó kifejezett beleegyezése nélkül.
A külső adathordozó kiválasztása a sebességre, kapacitásra és hordozhatóságra vonatkozó követelményektől függ. A különböző adathordozó típusok eltérő sebességi jellemzőkkel, fájlrendszerekkel és használati forgatókönyvekkel rendelkeznek a mobilalkalmazásokban.
| Adathordozó típusa | Max. kapacitás | Olvasási sebesség | Fájlrendszer |
|---|---|---|---|
| SD UHS-I | 2 TB | akár 104 MB/s | exFAT / FAT32 |
| SD UHS-II | 2 TB | akár 312 MB/s | exFAT / FAT32 |
| USB 3.0 OTG | 2 TB | akár 400 MB/s | exFAT / NTFS / FAT32 |
| USB-C SSD | 4 TB | akár 1000 MB/s | exFAT / APFS / NTFS |
Az SD-kártyák írási sebesség szerint osztályozhatók: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) és V90 (90 MB/s). A 4K videó rögzítéséhez legalább U3 vagy V30 osztályú kártya szükséges. Nagy médiafájlokkal dolgozó mobilalkalmazásokhoz (fotófeldolgozás, videószerkesztés) U3 és magasabb osztályú kártyák használata ajánlott. A kártya sebessége közvetlenül befolyásolja az alkalmazás teljesítményét: a 4K videó Class 10 kártyára történő rögzítése képkockák kihagyását okozhatja az elégtelen átviteli sebesség miatt. SD-kártya kiválasztásakor ne csak a sebességosztályra figyeljen, hanem az Application Performance Class besorolásra is: az A1 és A2 a véletlenszerű olvasás és írás minimális teljesítményét jelzi, ami kritikus az adatbázisok és az alkalmazás-gyorsítótár működéséhez.
USB-OTG (On-The-Go) lehetővé teszi külső USB-meghajtók csatlakoztatását mobileszközökhöz adapteren keresztül. Az Android a 3.1-es verziótól támogatja az OTG-t, de a meghajtó csatlakoztatásához a fájlrendszert támogató kernel szükséges. A FAT32 és exFAT natívan támogatott, az NTFS csak egyedi kernellel rendelkező eszközökön vagy a Paragon könyvtáron keresztül érhető el. iOS-en az USB-meghajtók támogatása az iOS 13-mal jelent meg a Files alkalmazással együtt. A meghajtóval való munkához az alkalmazásnak a UIDocumentPickerViewController-et kell használnia, amely csak a felhasználó által kiválasztott fájlokhoz biztosít hozzáférést — az iOS nem biztosít teljes hozzáférést a meghajtó fájlrendszeréhez.
A felhőszolgáltatások — iCloud, Google Drive, Dropbox — integrálódhatnak az eszköz fájlrendszerébe rendszer-szolgáltatókon keresztül. iOS-en az iCloud Drive az alkalmazás Sandbox-konténerének része, és a fájlok automatikusan szinkronizálódnak a felhasználó eszközei között. Androidon a Google Drive API-t biztosít a fájlok olvasásához és írásához, de közvetlen fájlrendszerbe csatlakoztatás nem történik. Nagy adatmennyiségekkel dolgozó mobilalkalmazások számára a felhőtároló alternatívát jelenthet az SD-kártyával szemben, különösen a bővítőhellyel nem rendelkező eszközökön.
A külső tárolóval való munka Androidon az operációs rendszer verziójától és a Scoped Storage modelltől függ. A fájlokhoz való hozzáférés folyamata eltér Android 9 és korábbi, Android 10–12 és Android 13+ esetén.
Android 10-től kezdve a közös médiafájlok elérésének fő módja a MediaStore API. Ez az API egységesített interfészt biztosít képek, videók és hangfájlok olvasásához és írásához a közös tárolóban. Az alkalmazásnak nincs szüksége READ_EXTERNAL_STORAGE engedélyre a saját fájljainak eléréséhez, de más alkalmazások fájljainak olvasásához továbbra is kifejezett felhasználói engedély szükséges. A MediaStore automatikusan indexeli a médiafájlokat, és ContentResolver-t biztosít a lekérdezésükhöz.
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)
A lekérdezés végrehajtása után egy Cursor objektumot kap, amely a fájlok URI-jait tartalmazza. A fájl olvasásához nyisson InputStream-et a contentResolver.openInputStream(uri) segítségével. Az írás hasonlóan történik a contentResolver.openOutputStream(uri) használatával. A MediaStore automatikusan kezeli a névütközéseket, és lehetőséget biztosít új fájlok beszúrására a contentResolver.insert(uri, values) segítségével, amely visszaadja a létrehozott fájl URI-ját.
Storage Access Framework (SAF) — az ajánlott mód tetszőleges fájlok elérésére Android 10+-on. A SAF rendszerfájl-választó párbeszédpanelt biztosít, amelyen keresztül a felhasználó hozzáférést ad az alkalmazásnak egy adott fájlhoz vagy könyvtárhoz. Az alkalmazás egy hozzáférési URI-t kap, amely az eszköz újraindításáig vagy az engedély kifejezett visszavonásáig a beállításokban érvényes. A SAF nem igényel READ_EXTERNAL_STORAGE vagy WRITE_EXTERNAL_STORAGE engedélyeket, ami leegyszerűsíti a Google Play-en való közzétételt és csökkenti az engedélykérések számát.
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)
iOS-en a külső fájlokkal való munka a UIDocumentPickerViewController-en keresztül történik, amelyet a felhasználó nyit meg bizonyos fájlok vagy könyvtárak kiválasztásához. Az alkalmazásnak nincs közvetlen hozzáférése a külső meghajtó fájlrendszeréhez — csak azokhoz a fájlokhoz, amelyeket a felhasználó kifejezetten kiválasztott. A fájl kiválasztása után az alkalmazás egy ideiglenes URL-címet kap a Sandbox-konténerben, és a FileManager-en keresztül dolgozhat a fájllal.
UIDocumentPickerViewController lehetővé teszi a felhasználó számára, hogy egy vagy több fájlt válasszon ki bármely elérhető forrásból: iCloud Drive, csatlakoztatott USB-meghajtó, külső felhőszolgáltatás. A kiválasztás után a vezérlő visszaad egy URL-tömböt, amelyet az alkalmazás a munkamenet során olvashat. A hozzáférés megőrzéséhez az alkalmazás bezárása után meg kell hívni a startAccessingSecurityScopedResource() metódust, és el kell menteni a security-scoped könyvjelzőt a UserDefaults-ba.
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)
}
A asCopy: true paraméter azt jelenti, hogy az iOS átmásolja a fájlt az alkalmazás Sandbox-konténerébe, és az alkalmazás saját másolatot kap, amely független az eredeti fájltól. Ha az asCopy: false értéket adja meg, az alkalmazás hivatkozást kap az eredeti fájlra, de a hozzáféréshez meg kell hívni a url.startAccessingSecurityScopedResource() metódust. Ennek a hívásnak a hiányában a fájl olvasása kivételt dob. A fájllal végzett munka befejezése után hívja meg a url.stopAccessingSecurityScopedResource() metódust az erőforrás lezárásához és a leírók szivárgásának megelőzéséhez.
A külső tároló biztonsága alacsonyabb, mint a belső tárolóé, mivel a fájlok más alkalmazások számára is elérhetők. Bármely, READ_EXTERNAL_STORAGE engedéllyel rendelkező alkalmazás elolvashatja az SD-kártyán lévő összes fájlt, beleértve azokat is, amelyeket az Ön alkalmazása hozott létre ideiglenes bizalmas adatok tárolására. Egy rosszindulatú alkalmazás átvizsgálhatja az SD-kártyát, és kinyerheti a felhasználói adatokat, ha azok nincsenek titkosítva. Ezért kategorikusan nem ajánlott hitelesítési tokeneket, jelszavakat vagy személyes adatokat tárolni a külső tárolón titkosítatlan formában.
Android 10+-on a Scoped Storage jelentősen korlátozza az alkalmazások hozzáférését a közös fájlrendszerhez. Az alkalmazás engedély nélkül csak a saját maga által létrehozott fájlokat olvashatja, más alkalmazások fájljaihoz pedig a felhasználó kifejezett hozzájárulása szükséges SAF-párbeszédablakon keresztül. Ez a korlátozás azonban nem vonatkozik azokra az alkalmazásokra, amelyek cél SDK-verziója 29 alatti — ezek továbbra is a régi modell szerint működnek, ami kockázatot jelent a nem frissített alkalmazásokat használó felhasználók számára. A Google Play 2021 óta megköveteli a targetSdkVersion 29+ alkalmazását minden új és frissített alkalmazás esetében.
Formázás és titkosítás — egy másik fontos biztonsági szempont. A hordozható tárolóként formázott SD-kártya alapértelmezés szerint nincs titkosítva a rendszer által. Még adoptable storage használata esetén is a titkosítás csak akkor aktiválódik, ha a készülék gyártója engedélyezte ezt a lehetőséget a rendszerképben. A külső tárolón tárolt bizalmas adatok védelméhez használja az EncryptedFile könyvtárat az AndroidX Security-ból, amely minden fájlt külön titkosít AES256-GCM használatával, függetlenül a rendszer szintű titkosítástól.
A külső tároló hatékony használata egyensúlyt igényel az adatok elérhetősége és biztonsága között. Kövesse az alábbi szabályokat a felhasználói fájlok megbízható tárolásának biztosításához.
Environment.getExternalStorageState() metódust az SD-kártya állapotának ellenőrzéséhez. A kártya eltávolítható, megsérülhet vagy írásra nem elérhető lehetFontos megjegyezni, hogy a külső tároló nem garantálja az adatok biztonságát meghibásodás esetén. Az SD-kártyák korlátozott újraírási ciklusokkal rendelkeznek, különösen az olcsóbb Class 4 és Class 6 modellek. Intenzív írás esetén (például naplózás vagy adatfolyamok gyorsítótárazása) a kártya néhány hónapon belül meghibásodhat. Az ilyen forgatókönyvekhez használja a belső memóriát vagy a felhőtárolót, a külső tárolón pedig csak olyan fájlokat tároljon, amelyek elvesztését a felhasználó elfogadhatónak tartja. Rendszeresen ellenőrizze az SD-kártya állapotát a StatFs segítségével, és tájékoztassa a felhasználót a fájlrendszer kritikus hibáiról.
Gyakran ismételt kérdések
Android 13+ rendszeren a READ_EXTERNAL_STORAGE engedélyt részletesebbek váltották fel: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO és READ_MEDIA_AUDIO. Más típusú fájlok eléréséhez használja a SAF-ot.
Igen, az adoptable storage funkció Android 6.0+-tól érhető el. A kártya ext4 formátumba kerül AES-128 titkosítással. Azonban sok gyártó kikapcsolja ezt a lehetőséget, és az eszközök körülbelül 88%-a nem támogatja az adoptable storage-t.
Használja az Environment.getExternalStorageState() metódust, amely egy állapotkarakterláncot ad vissza. A MEDIA_MOUNTED érték azt jelenti, hogy a kártya olvasásra és írásra elérhető. Más értékek hibát vagy a kártya hiányát jelzik.
Scoped Storage az alkalmazást saját konténerére és a közös MediaStore médiatárakra korlátozza. A teljes hozzáférés lehetővé teszi bármely fájl olvasását az eszközön. A Scoped Storage növeli a felhasználói adatok biztonságát, és kötelező az új alkalmazások számára.
Indítson Intent-et az ACTION_OPEN_DOCUMENT_TREE művelettel, amely megnyitja a rendszer könyvtárválasztó párbeszédablakát. A kiválasztás után egy URI-engedélyt kap, amely az újraindításig érvényes. Mentse el ezt az URI-t a SharedPreferences-be későbbi használatra.
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is