Pamięć zewnętrzna Android: co to jest, typy nośników i jak pracować w programowaniu

Autor: IT Sectr Opublikowano: 2026-03-13 Czas czytania: 11 min

Pamięć zewnętrzna na urządzeniach mobilnych to wymienny nośnik danych, do którego dostęp może uzyskać każda aplikacja z odpowiednimi uprawnieniami. Według Android Open Source Project, 2026, począwszy od Androida 10 Google wprowadził Scoped Storage — model, który ogranicza bezpośredni dostęp do systemu plików i wymaga użycia MediaStore API do pracy ze wspólnymi plikami multimedialnymi. Takie podejście zwiększa bezpieczeństwo danych użytkownika i zapobiega wyciekowi informacji między aplikacjami.

Najważniejsze

  • External Storage — wymienne przechowywanie (karta SD, USB-OTG), dostępne do odczytu i zapisu dla różnych aplikacji
  • Scoped Storage na Androidzie 10+ ogranicza bezpośredni dostęp do systemu plików i zastępuje go MediaStore API
  • iOS nie obsługuje kart SD — dostęp do plików zewnętrznych odbywa się przez Document Picker
  • Uprawnienia READ_EXTERNAL_STORAGE i WRITE_EXTERNAL_STORAGE są wymagane dla Androida 9 i niżej
  • Formatowanie karty SD jako pamięci wewnętrznej lub przenośnej określa model dostępu i szyfrowania

Czym jest pamięć zewnętrzna na urządzeniach mobilnych?

Pamięć zewnętrzna to obszar pamięci, który nie wchodzi w skład chronionego piaskownicy aplikacji i jest dostępny dla innych programów. Na Androidzie pod tym terminem zwykle rozumie się kartę SD, ale do pamięci zewnętrznej zalicza się również dyski USB podłączone przez adapter OTG oraz dyski w chmurze zintegrowane na poziomie systemu plików. Główna różnica w stosunku do Internal Storage — brak izolacji: pliki w pamięci zewnętrznej może odczytać i modyfikować każda aplikacja, która uzyskała odpowiednie uprawnienia.

Na Androidzie pamięć zewnętrzna jest reprezentowana przez dwa główne tryby: przenośny (portable) i wewnętrzny (adoptable). Podczas formatowania karty SD jako pamięci przenośnej pozostaje ona wymienna i jest formatowana w FAT32 lub exFAT. W trybie adoptable storage karta jest formatowana w ext4 i szyfrowana przy użyciu AES-128, po czym system postrzega ją jako rozszerzenie pamięci wewnętrznej. Tryb adoptable jest dostępny od Androida 6.0 Marshmallow, ale producenci urządzeń często wyłączają tę opcję w swoich oprogramowaniach układowych. Według statystyk Google Play Console tylko około 12% urządzeń z Androidem obsługuje adoptable storage, dlatego poleganie na rozszerzaniu pamięci wewnętrznej przez kartę SD jako jedynej opcji nie jest zalecane.

Na iOS nie ma tradycyjnych kart SD. Apple używa zamkniętej architektury, w której całe przechowywanie opiera się na wewnętrznej pamięci flash i iCloud. Zewnętrzne dyski są obsługiwane przez port Lightning lub USB-C, ale dostęp do nich jest ograniczony do systemowego menedżera plików Files i aplikacji integrujących się z Document Picker. Użytkownik sam decyduje, które pliki otworzyć z zewnętrznego źródła — aplikacja nie może skanować podłączonego dysku bez wyraźnej zgody.

Typy nośników zewnętrznych i ich charakterystyka

Wybór nośnika zewnętrznego zależy od wymagań dotyczących szybkości, pojemności i przenośności. Różne typy nośników mają różne charakterystyki szybkościowe, systemy plików i scenariusze użycia w aplikacjach mobilnych.

Typ nośnikaMaks. pojemnośćPrędkość odczytuSystem plików
SD UHS-I2 TBdo 104 MB/sexFAT / FAT32
SD UHS-II2 TBdo 312 MB/sexFAT / FAT32
USB 3.0 OTG2 TBdo 400 MB/sexFAT / NTFS / FAT32
USB-C SSD4 TBdo 1000 MB/sexFAT / APFS / NTFS

Karty SD i klasy prędkości

Karty SD są klasyfikowane według prędkości zapisu: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) i V90 (90 MB/s). Do nagrywania wideo 4K wymagana jest karta co najmniej U3 lub V30. W przypadku aplikacji mobilnych pracujących z dużymi plikami multimedialnymi (obróbka zdjęć, montaż wideo) zaleca się używanie kart klasy U3 i wyższej. Prędkość karty bezpośrednio wpływa na wydajność aplikacji: nagrywanie wideo 4K na karcie Class 10 może powodować pomijanie klatek z powodu niewystarczającej przepustowości. Wybierając kartę SD do aplikacji, zwracaj uwagę nie tylko na klasę prędkości, ale także na rating Application Performance Class: A1 i A2 wskazują minimalną wydajność losowego odczytu i zapisu, kluczową dla działania baz danych i pamięci podręcznej aplikacji.

Dyski USB-OTG

USB-OTG (On-The-Go) umożliwia podłączenie zewnętrznych dysków USB do urządzenia mobilnego za pośrednictwem adaptera. Android obsługuje OTG od wersji 3.1, ale do zamontowania dysku wymagane jest jądro z obsługą systemu plików. FAT32 i exFAT są obsługiwane domyślnie, NTFS — tylko na urządzeniach z niestandardowym jądrem lub za pośrednictwem biblioteki Paragon. Na iOS obsługa dysków USB pojawiła się w iOS 13 wraz z aplikacją Files. Do pracy z dyskiem aplikacja musi użyć UIDocumentPickerViewController, który udostępnia dostęp tylko do plików wybranych przez użytkownika — pełny dostęp do systemu plików dysku iOS nie zapewnia.

Przechowywanie w chmurze jako rozszerzenie

Usługi w chmurze — iCloud, Google Drive, Dropbox — mogą integrować się z systemem plików urządzenia za pośrednictwem dostawców systemowych. Na iOS iCloud Drive jest częścią kontenera Sandbox aplikacji, a pliki są automatycznie synchronizowane między urządzeniami użytkownika. Na Androidzie Google Drive udostępnia API do odczytu i zapisu plików, ale nie następuje bezpośrednie montowanie w systemie plików. W przypadku aplikacji mobilnych pracujących z dużymi ilościami danych przechowywanie w chmurze może służyć jako alternatywa dla karty SD, szczególnie na urządzeniach bez gniazda rozszerzeń.

Jak pracować z pamięcią zewnętrzną na Androidzie

Praca z zewnętrzną pamięcią na Androidzie zależy od wersji systemu operacyjnego i modelu Scoped Storage. Proces dostępu do plików różni się dla Androida 9 i niżej, Androida 10–12 oraz Androida 13+.

Dostęp przez MediaStore API

Począwszy od Androida 10, głównym sposobem dostępu do wspólnych plików multimedialnych jest MediaStore API. Ten interfejs API udostępnia ujednolicony interfejs do odczytu i zapisu obrazów, wideo i plików audio we wspólnym przechowywaniu. Aplikacja nie wymaga uprawnienia READ_EXTERNAL_STORAGE do dostępu do własnych plików, ale do odczytu plików innych aplikacji nadal potrzebna jest wyraźna zgoda użytkownika. MediaStore automatycznie indeksuje pliki multimedialne i udostępnia ContentResolver do ich zapytania.

kotlin
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 wykonaniu zapytania otrzymujesz Cursor zawierający URI plików. Aby odczytać plik, otwórz InputStream przez contentResolver.openInputStream(uri). Zapis odbywa się analogicznie przez contentResolver.openOutputStream(uri). MediaStore automatycznie obsługuje konflikty nazw i umożliwia wstawianie nowych plików przez contentResolver.insert(uri, values), który zwraca URI utworzonego pliku.

Praca z dowolnymi plikami przez SAF

Storage Access Framework (SAF) — zalecany sposób dostępu do dowolnych plików na Androidzie 10+. SAF udostępnia systemowe okno dialogowe wyboru plików, za pośrednictwem którego użytkownik udziela aplikacji dostępu do konkretnego pliku lub katalogu. Aplikacja otrzymuje URI dostępu, który działa do ponownego uruchomienia urządzenia lub do wyraźnego cofnięcia uprawnienia w ustawieniach. SAF nie wymaga uprawnień READ_EXTERNAL_STORAGE ani WRITE_EXTERNAL_STORAGE, co upraszcza publikację w Google Play i zmniejsza liczbę żądań uprawnień.

kotlin
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)

Jak pracować z pamięcią zewnętrzną na iOS

Na iOS praca z plikami zewnętrznymi odbywa się przez UIDocumentPickerViewController, który użytkownik otwiera, aby wybrać konkretne pliki lub katalogi. Aplikacja nie ma bezpośredniego dostępu do systemu plików zewnętrznego dysku — tylko do tych plików, które użytkownik wyraźnie wybrał. Po wybraniu pliku aplikacja otrzymuje tymczasowy adres URL w kontenerze Sandbox i może pracować z plikiem za pośrednictwem FileManager.

Używanie UIDocumentPickerViewController

UIDocumentPickerViewController umożliwia użytkownikowi wybranie jednego lub kilku plików z dowolnego dostępnego źródła: iCloud Drive, podłączonego dysku USB, zewnętrznej usługi w chmurze. Po wybraniu kontroler zwraca tablicę adresów URL, które aplikacja może odczytać w trakcie sesji. Aby zachować dostęp po zamknięciu aplikacji, należy wywołać startAccessingSecurityScopedResource() i zapisać zakładkę z ograniczonym zakresem bezpieczeństwa w UserDefaults.

swift
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 oznacza, że iOS skopiuje plik do kontenera Sandbox aplikacji, a aplikacja otrzyma własną kopię, niezależną od oryginalnego pliku. W przypadku asCopy: false aplikacja otrzymuje link do oryginalnego pliku, ale aby uzyskać do niego dostęp, należy wywołać url.startAccessingSecurityScopedResource(). Bez tego wywołania odczyt pliku spowoduje wyjątek. Po zakończeniu pracy z plikiem koniecznie wywołaj url.stopAccessingSecurityScopedResource(), aby zamknąć zasób i zapobiec wyciekowi deskryptorów.

Ograniczenia i bezpieczeństwo pamięci zewnętrznej

Bezpieczeństwo pamięci zewnętrznej jest niższe niż Internal Storage, ponieważ pliki są dostępne dla innych aplikacji. Każda aplikacja z uprawnieniem READ_EXTERNAL_STORAGE może odczytać wszystkie pliki na karcie SD, w tym te, które Twoja aplikacja utworzyła do tymczasowego przechowywania poufnych danych. Złośliwa aplikacja może przeskanować kartę SD i wydobyć dane użytkownika, jeśli nie są zaszyfrowane. Dlatego kategorycznie nie zaleca się przechowywania tokenów uwierzytelniania, haseł ani danych osobowych użytkownika w pamięci zewnętrznej w otwartej postaci.

Na Androidzie 10+ Scoped Storage znacząco ogranicza możliwości aplikacji w zakresie dostępu do wspólnego systemu plików. Aplikacja może bez uprawnienia odczytywać tylko pliki, które sama utworzyła, a do dostępu do plików innych aplikacji wymagana jest wyraźna zgoda użytkownika za pośrednictwem okna dialogowego SAF. Jednak to ograniczenie nie dotyczy aplikacji z docelową wersją SDK poniżej 29 — nadal działają one według starego modelu, co stwarza ryzyko dla użytkowników, którzy nie zaktualizowali aplikacji. Google Play od 2021 roku wymaga targetSdkVersion 29+ dla wszystkich nowych i aktualizowanych aplikacji.

Formatowanie i szyfrowanie — kolejny ważny aspekt bezpieczeństwa. Karta SD sformatowana jako pamięć przenośna nie jest domyślnie szyfrowana przez system. Nawet w przypadku użycia adoptable storage szyfrowanie jest aktywowane tylko wtedy, gdy producent urządzenia włączył tę możliwość w oprogramowaniu układowym. Aby chronić poufne dane zapisywane w pamięci zewnętrznej, używaj biblioteki EncryptedFile z AndroidX Security, która szyfruje każdy plik oddzielnie przy użyciu AES256-GCM, niezależnie od szyfrowania systemowego.

Zalecenia dotyczące używania pamięci zewnętrznej

Efektywne używanie pamięci zewnętrznej wymaga równowagi między dostępnością danych a bezpieczeństwem. Przestrzegaj następujących zasad, aby zapewnić niezawodne przechowywanie plików użytkownika.

  • Nie przechowuj poufnych danych w pamięci zewnętrznej bez szyfrowania. Używaj EncryptedFile lub EncryptedSharedPreferences do ochrony tokenów, haseł i danych osobowych
  • Sprawdzaj dostępność pamięci zewnętrznej przed zapisem: użyj Environment.getExternalStorageState() do sprawdzenia stanu karty SD. Karta może być wyjęta, uszkodzona lub niedostępna do zapisu
  • Używaj Scoped Storage na Androidzie 10+ i SAF do dostępu do wspólnych plików. Zmniejsza to liczbę żądanych uprawnień i poprawia doświadczenie użytkownika
  • Zawsze obsługuj wyjątki podczas pracy z pamięcią zewnętrzną. Plik może zostać usunięty przez inną aplikację lub przeniesiony w momencie odczytu, co spowoduje FileNotFoundException
  • Ostrzegaj użytkownika przed zapisem dużych ilości danych w pamięci zewnętrznej. Pokaż okno dialogowe potwierdzenia i daj możliwość wyboru katalogu przez SAF

Ważne jest, aby pamiętać, że pamięć zewnętrzna nie gwarantuje bezpieczeństwa danych w przypadku awarii. Karty SD mają ograniczony zasób cykli nadpisu, szczególnie modele budżetowe klasy Class 4 i Class 6. Przy intensywnym zapisie (na przykład rejestrowanie lub buforowanie danych strumieniowych) karta może ulec awarii w ciągu kilku miesięcy. W takich scenariuszach używaj pamięci wewnętrznej lub przechowywania w chmurze, a w pamięci zewnętrznej przechowuj tylko pliki, których utratę użytkownik uzna za akceptowalną. Regularnie sprawdzaj stan karty SD przez StatFs i informuj użytkownika o krytycznych błędach systemu plików.

Często zadawane pytania

Czy potrzebne jest uprawnienie do dostępu do pamięci zewnętrznej na Androidzie 13?

Na Androidzie 13+ uprawnienie READ_EXTERNAL_STORAGE zostało zastąpione bardziej szczegółowymi: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO i READ_MEDIA_AUDIO. Do dostępu do innych typów plików używaj SAF.

Czy można sformatować kartę SD jako pamięć wewnętrzną?

Tak, funkcja adoptable storage jest dostępna na Androidzie 6.0+. Karta jest formatowana w ext4 z szyfrowaniem AES-128. Jednak wielu producentów wyłącza tę opcję, a około 88% urządzeń nie obsługuje adoptable storage.

Jak sprawdzić, czy karta SD jest zainstalowana w urządzeniu?

Użyj metody Environment.getExternalStorageState(), która zwraca ciąg stanu. Wartość MEDIA_MOUNTED oznacza, że karta jest dostępna do odczytu i zapisu. Inne wartości wskazują na błędy lub brak karty.

Jaka jest różnica między Scoped Storage a pełnym dostępem do systemu plików?

Scoped Storage ogranicza aplikację do jej własnego kontenera i wspólnych bibliotek multimedialnych MediaStore. Pełny dostęp umożliwia odczyt dowolnych plików na urządzeniu. Scoped Storage zwiększa bezpieczeństwo danych użytkownika i jest obowiązkowy dla nowych aplikacji.

Jak uzyskać URI dostępu do pliku na karcie SD przez SAF?

Uruchom Intent z akcją ACTION_OPEN_DOCUMENT_TREE, który otworzy systemowe okno dialogowe wyboru katalogu. Po wybraniu otrzymasz URI-zezwolenie działające do ponownego uruchomienia. Zapisz ten URI w SharedPreferences do późniejszego użycia.

Podsumowanie

  • External Storage — wymienne przechowywanie (karta SD, USB-OTG), dostępne dla wszystkich aplikacji z odpowiednimi uprawnieniami
  • Scoped Storage na Androidzie 10+ ogranicza bezpośredni dostęp do systemu plików i wprowadza MediaStore API dla plików multimedialnych
  • iOS nie obsługuje kart SD — dostęp do plików zewnętrznych tylko przez UIDocumentPickerViewController
  • Karty SD dzielą się na klasy prędkości: Class 10, U1, U3, V30, V90 — do nagrywania wideo 4K wymagane jest minimum U3
  • Bezpieczeństwo pamięci zewnętrznej jest niższe niż wewnętrznej — szyfruj poufne dane przed zapisem
  • Adoptable storage pozwala użyć karty SD jako rozszerzenia pamięci wewnętrznej, ale jest obsługiwany tylko na 12% urządzeń
  • Zaleca się używanie SAF do dostępu do dowolnych plików i nieprzechowywanie krytycznych danych bez szyfrowania

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również