Ang external storage sa mga mobile device ay isang naaalis na daluyan ng data na maaaring ma-access ng anumang application na may naaangkop na mga pahintulot. Ayon sa Android Open Source Project, 2026, simula sa Android 10, ipinakilala ng Google ang Scoped Storage — isang modelo na naglilimita sa direktang pag-access sa file system at nangangailangan ng paggamit ng MediaStore API para sa pagtatrabaho sa mga shared media file. Ang pamamaraang ito ay nagpapataas ng seguridad ng data ng gumagamit at pumipigil sa pagtagas ng impormasyon sa pagitan ng mga application.
Mga Pangunahing Punto
READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE ay kinakailangan para sa Android 9 at mas mababaExternal storage — ay isang lugar ng memorya na hindi kabilang sa protektadong sandbox ng application at naa-access ng iba pang mga programa. Sa Android, ang terminong ito ay karaniwang tumutukoy sa SD card, ngunit ang external storage ay kasama rin ang mga USB drive na konektado sa pamamagitan ng OTG adapter at cloud disk na isinama sa antas ng file system.
Sa Android, ang external storage ay ipinakita sa dalawang pangunahing mode: portable at adoptable. Sa pag-format ng SD card bilang portable storage, nananatili itong naaalis at naka-format sa FAT32 o exFAT. Sa adoptable storage mode, ang card ay naka-format sa ext4 at naka-encrypt ng AES-128, pagkatapos nito ay nakikita ito ng system bilang extension ng internal memory. Ang adoptable mode ay available simula sa Android 6.0 Marshmallow, ngunit ang mga tagagawa ng device ay madalas na hindi pinapagana ang opsyong ito sa kanilang firmware. Ayon sa mga istatistika ng Google Play Console, halos 12% lamang ng mga Android device ang sumusuporta sa adoptable storage, kaya hindi inirerekomenda na umasa sa pagpapalawak ng internal memory sa pamamagitan ng SD card bilang tanging opsyon.
Sa iOS ay walang tradisyonal na SD card. Gumagamit ang Apple ng saradong arkitektura kung saan ang lahat ng storage ay binuo sa internal flash memory at iCloud. Ang mga external na drive ay sinusuportahan sa pamamagitan ng Lightning o USB-C port, ngunit ang pag-access sa mga ito ay limitado sa system file manager Files at mga application na naka-integrate sa Document Picker. Ang gumagamit mismo ang nagpapasya kung aling mga file ang bubuksan mula sa external na source — hindi ma-scan ng application ang konektadong drive nang walang malinaw na pahintulot.
Pagpili ng external media ay depende sa mga kinakailangan para sa bilis, kapasidad, at portability. Ang iba’t ibang uri ng media ay may iba’t ibang katangian ng bilis, file system, at mga sitwasyon ng paggamit sa mga mobile application.
| Uri ng media | Max. kapasidad | Bilis ng pagbasa | File system |
|---|---|---|---|
| SD UHS-I | 2 TB | hanggang 104 MB/s | exFAT / FAT32 |
| SD UHS-II | 2 TB | hanggang 312 MB/s | exFAT / FAT32 |
| USB 3.0 OTG | 2 TB | hanggang 400 MB/s | exFAT / NTFS / FAT32 |
| USB-C SSD | 4 TB | hanggang 1000 MB/s | exFAT / APFS / NTFS |
SD card ay inuuri ayon sa bilis ng pagsulat: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) at V90 (90 MB/s). Para sa pag-record ng 4K video, kinakailangan ang card na hindi bababa sa U3 o V30. Para sa mga mobile application na nagtatrabaho sa malalaking media file (pagproseso ng larawan, pag-edit ng video), inirerekomenda ang paggamit ng mga card ng klase U3 at mas mataas. Ang bilis ng card ay direktang nakakaapekto sa pagganap ng application: ang pag-record ng 4K video sa Class 10 card ay maaaring magdulot ng pagkawala ng frame dahil sa hindi sapat na bandwidth. Kapag pumipili ng SD card para sa application, bigyang-pansin hindi lamang ang klase ng bilis, kundi pati na rin ang rating ng Application Performance Class: A1 at A2 ay nagpapahiwatig ng pinakamababang pagganap ng random na pagbasa at pagsulat, na kritikal para sa pagpapatakbo ng mga database at cache ng application.
USB-OTG (On-The-Go) ay nagbibigay-daan sa pagkonekta ng mga external na USB drive sa mobile device sa pamamagitan ng adapter. Sinusuportahan ng Android ang OTG simula sa bersyon 3.1, ngunit para sa pag-mount ng drive ay kinakailangan ang kernel na may suporta sa file system. Ang FAT32 at exFAT ay sinusuportahan bilang default, NTFS — lamang sa mga device na may custom na kernel o sa pamamagitan ng Paragon library. Sa iOS, lumitaw ang suporta para sa USB drive sa iOS 13 kasama ang application na Files. Para magtrabaho sa drive, dapat gamitin ng application ang UIDocumentPickerViewController, na nagbubukas ng access lamang sa mga file na pinili ng gumagamit — hindi nagbibigay ang iOS ng buong access sa file system ng drive.
Mga serbisyo sa cloud — iCloud, Google Drive, Dropbox — ay maaaring isama sa file system ng device sa pamamagitan ng mga system provider. Sa iOS, ang iCloud Drive ay bahagi ng Sandbox container ng application, at ang mga file ay awtomatikong nagsi-sync sa pagitan ng mga device ng gumagamit. Sa Android, ang Google Drive ay nagbibigay ng API para sa pagbasa at pagsulat ng mga file, ngunit walang direktang pag-mount sa file system. Para sa mga mobile application na nagtatrabaho sa malalaking volume ng data, ang cloud storage ay maaaring magsilbing alternatibo sa SD card, lalo na sa mga device na walang expansion slot.
Pagtatrabaho sa external storage sa Android ay depende sa bersyon ng operating system at sa modelo ng Scoped Storage. Ang proseso ng pag-access sa mga file ay naiiba para sa Android 9 at mas mababa, Android 10–12 at Android 13+.
Simula Android 10, ang pangunahing paraan ng pag-access sa mga shared media file ay MediaStore API. Ang API na ito ay nagbibigay ng pinag-isang interface para sa pagbasa at pagsulat ng mga imahe, video, at audio file sa shared storage. Ang application ay hindi nangangailangan ng pahintulot na READ_EXTERNAL_STORAGE para ma-access ang sarili nitong mga file, ngunit para sa pagbasa ng mga file ng iba pang mga application ay kailangan pa rin ang malinaw na pahintulot ng gumagamit. Awtomatikong ini-index ng MediaStore ang mga media file at nagbibigay ng ContentResolver para sa pag-query sa mga ito.
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)
Pagkatapos isagawa ang query, makakakuha ka ng Cursor na naglalaman ng URI ng mga file. Para basahin ang file, buksan ang InputStream sa pamamagitan ng contentResolver.openInputStream(uri). Ang pagsulat ay ginagawa nang katulad sa pamamagitan ng contentResolver.openOutputStream(uri). Awtomatikong pinangangasiwaan ng MediaStore ang mga conflict ng pangalan at nagbibigay ng kakayahang magpasok ng mga bagong file sa pamamagitan ng contentResolver.insert(uri, values), na nagbabalik ng URI ng nilikhang file.
Storage Access Framework (SAF) — inirerekomendang paraan para sa pag-access sa mga arbitrary file sa Android 10+. Ang SAF ay nagbibigay ng system dialog ng pagpili ng file, kung saan binibigyan ng gumagamit ang application ng access sa isang partikular na file o direktoryo. Ang application ay nakakatanggap ng access URI na may bisa hanggang sa i-restart ang device o hanggang sa malinaw na bawiin ang pahintulot sa pamamagitan ng mga setting. Ang SAF ay hindi nangangailangan ng mga pahintulot na READ_EXTERNAL_STORAGE o WRITE_EXTERNAL_STORAGE, na nagpapasimple sa pag-publish sa Google Play at nagbabawas ng bilang ng mga kahilingan ng pahintulot.
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)
Sa iOS, ang pagtatrabaho sa mga external na file ay sa pamamagitan ng UIDocumentPickerViewController, na binuksan ng gumagamit upang pumili ng mga partikular na file o direktoryo. Ang application ay walang direktang access sa file system ng external drive — lamang sa mga file na malinaw na pinili ng gumagamit. Pagkatapos pumili ng file, ang application ay nakakatanggap ng pansamantalang URL address sa Sandbox container at maaaring magtrabaho sa file sa pamamagitan ng FileManager.
UIDocumentPickerViewController ay nagpapahintulot sa gumagamit na pumili ng isa o maramihang mga file mula sa anumang available na source: iCloud Drive, konektadong USB drive, third-party cloud service. Pagkatapos ng pagpili, ang controller ay nagbabalik ng array ng mga URL na maaaring basahin ng application sa panahon ng session. Para mapanatili ang access pagkatapos isara ang application, kailangang tawagin ang startAccessingSecurityScopedResource() at mag-save ng secure na bookmark sa 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 ay nangangahulugan na kokopyahin ng iOS ang file sa Sandbox container ng application, at ang application ay makakatanggap ng sarili nitong kopya na independyente sa orihinal na file. Kung ang asCopy: false ay tinukoy, ang application ay nakakatanggap ng referensya sa orihinal na file, ngunit para ma-access ito ay kailangang tawagin ang url.startAccessingSecurityScopedResource(). Kung wala ang tawag na ito, ang pagbasa ng file ay magdudulot ng exception. Pagkatapos matapos ang trabaho sa file, siguraduhing tawagin ang url.stopAccessingSecurityScopedResource() upang isara ang resource at maiwasan ang pagtagas ng mga descriptor.
Seguridad ng external storage ay mas mababa kaysa sa Internal Storage dahil ang mga file ay naa-access ng iba pang mga application. Anumang application na may pahintulot na READ_EXTERNAL_STORAGE ay maaaring basahin ang lahat ng file sa SD card, kabilang ang mga file na nilikha ng iyong application para sa pansamantalang pag-iimbak ng kumpidensyal na data. Ang isang malisyosong application ay maaaring mag-scan ng SD card at kunin ang data ng gumagamit kung hindi naka-encrypt ang mga ito. Kaya naman, hindi inirerekomenda na mag-imbak ng mga authentication token, password, o personal na data ng gumagamit sa external storage sa bukas na anyo.
Sa Android 10+ Scoped Storage ay makabuluhang naglilimita sa mga kakayahan ng application na ma-access ang shared file system. Ang application na walang pahintulot ay maaari lamang magbasa ng mga file na nilikha nito mismo, at para sa pag-access sa mga file ng iba pang mga application ay kinakailangan ang malinaw na pahintulot ng gumagamit sa pamamagitan ng SAF dialog. Gayunpaman, ang limitasyong ito ay hindi nalalapat sa mga application na may target na SDK version na mas mababa sa 29 — patuloy silang gumagana ayon sa lumang modelo, na lumilikha ng panganib para sa mga gumagamit na hindi na-update ang kanilang mga application. Ang Google Play mula noong 2021 ay nangangailangan ng targetSdkVersion 29+ para sa lahat ng bago at na-update na application.
Pag-format at pag-encrypt — isa pang mahalagang aspeto ng seguridad. Ang SD card na na-format bilang portable storage ay hindi naka-encrypt ng system bilang default. Kahit na gumagamit ng adoptable storage, ang pag-encrypt ay isina-activate lamang kung ang tagagawa ng device ay nagsama ng opsyong ito sa firmware. Para protektahan ang kumpidensyal na data na nakaimbak sa external storage, gamitin ang library na EncryptedFile mula sa AndroidX Security, na nag-e-encrypt sa bawat file nang hiwalay gamit ang AES256-GCM, anuman ang system encryption.
Epektibong paggamit ng external storage ay nangangailangan ng balanse sa pagitan ng availability ng data at seguridad. Sundin ang mga sumusunod na patakaran upang matiyak ang maaasahang pag-iimbak ng mga file ng gumagamit.
Environment.getExternalStorageState() upang suriin ang estado ng SD card. Ang card ay maaaring natanggal, nasira, o hindi available para sa pagsulatMahalagang tandaan na ang external storage ay hindi ginagarantiyahan ang integridad ng data sa panahon ng pagkasira. Ang SD card ay may limitadong resource ng mga cycle ng pagsulat muli, lalo na ang mga budget model ng klase Class 4 at Class 6. Sa masinsinang pagsulat (halimbawa, logging o caching ng streaming data), ang card ay maaaring masira sa loob ng ilang buwan. Para sa mga ganitong sitwasyon, gamitin ang internal memory o cloud storage, at sa external storage ay mag-imbak lamang ng mga file na ang pagkawala ay itinuturing ng gumagamit na katanggap-tanggap. StatFs at ipaalam sa gumagamit ang tungkol sa mga kritikal na error ng file system.
Mga Madalas Itanong
Sa Android 13+ ang pahintulot na READ_EXTERNAL_STORAGE ay pinalitan ng mas granular: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO at READ_MEDIA_AUDIO. Para sa pag-access sa iba pang uri ng file, gamitin ang SAF.
Oo, ang function na adoptable storage ay available sa Android 6.0+. Ang card ay naka-format sa ext4 na may AES-128 encryption. Gayunpaman, maraming tagagawa ang hindi pinapagana ang opsyong ito, at halos 88% ng mga device ay hindi sumusuporta sa adoptable storage.
Gamitin ang paraan Environment.getExternalStorageState(), na nagbabalik ng string ng estado. Ang halagang MEDIA_MOUNTED ay nangangahulugan na ang card ay available para sa pagbasa at pagsulat. Ang iba pang mga halaga ay nagpapahiwatig ng mga error o kawalan ng card.
Scoped Storage ay naglilimita sa application sa sarili nitong container at shared MediaStore media library. Ang buong access ay nagpapahintulot sa pagbasa ng anumang file sa device. ng data ng gumagamit at kinakailangan para sa mga bagong application.
Magpatakbo ng Intent na may action na ACTION_OPEN_DOCUMENT_TREE, na magbubukas ng system dialog ng pagpili ng direktoryo. Pagkatapos pumili, makakakuha ka ng URI permit na may bisa hanggang sa restart. I-save ang URI na ito sa SharedPreferences para sa susunod na paggamit.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din