Android używa systemu plików podobnego do systemów plików na dyskach na innych platformach. System udostępnia kilka opcji zapisywania danych aplikacji:
- Miejsce na dane aplikacji: przechowuj pliki przeznaczone wyłącznie do użytku w aplikacji w odpowiednich katalogach w pamięci wewnętrznej lub w różnych katalogach w pamięci zewnętrznej. Używaj katalogów w pamięci wewnętrznej do zapisywania informacji poufnych, do których inne aplikacje nie powinny mieć dostępu.
- Pamięć współdzielona: przechowuj pliki, które aplikacja ma udostępniać innym aplikacjom, w tym multimedia, dokumenty i inne pliki.
- Ustawienia: przechowuj prywatne dane pierwotne w postaci par klucz-wartość.
- Bazy danych: przechowuj dane strukturalne w prywatnej bazie danych za pomocą biblioteki trwałości Room.
Charakterystyka tych opcji została podsumowana w tej tabeli:
Typ treści | Metoda dostępu | Wymagane uprawnienia | Czy inne aplikacje mają do nich dostęp? | Czy pliki są usuwane po odinstalowaniu aplikacji? | |
---|---|---|---|---|---|
Pliki dotyczące aplikacji | Pliki przeznaczone tylko do użytku w aplikacji | z pamięci wewnętrznejgetFilesDir() lub
getCacheDir() z pamięci zewnętrznej getExternalFilesDir() lub
getExternalCacheDir() |
Nigdy nie jest potrzebne w przypadku pamięci wewnętrznej Nie jest potrzebne w przypadku pamięci zewnętrznej, gdy aplikacja jest używana na urządzeniach z Androidem 4.4 (API na poziomie 19) lub nowszym. |
Nie | Tak |
Media | pliki multimedialne, które można udostępniać (obrazy, pliki audio, filmy); | MediaStore Interfejs API |
READ_EXTERNAL_STORAGE podczas uzyskiwania dostępu do plików innych aplikacji na Androidzie 11 (poziom API 30) lub nowszymREAD_EXTERNAL_STORAGE lub WRITE_EXTERNAL_STORAGE
podczas uzyskiwania dostępu do plików innych aplikacji na Androidzie 10 (poziom API 29)Uprawnienia są wymagane w przypadku wszystkich plików na Androidzie 9 (poziom API 28) lub starszym. |
Tak, ale inna aplikacja musi mieć uprawnienie READ_EXTERNAL_STORAGE |
Nie |
Dokumenty i inne pliki | inne typy treści, które można udostępniać, w tym pobrane pliki; | Storage Access Framework | Brak | Tak, za pomocą systemowego okna wyboru plików | Nie |
Ustawienia aplikacji | Pary klucz-wartość | Biblioteka Jetpack Preferences | Brak | Nie | Tak |
Baza danych | Uporządkowane dane | Biblioteka trwałości danych Room | Brak | Nie | Tak |
Wybrane rozwiązanie zależy od Twoich konkretnych potrzeb:
- Ile miejsca zajmują Twoje dane?
- Pamięć wewnętrzna ma ograniczoną ilość miejsca na dane aplikacji. Jeśli musisz zapisać dużą ilość danych, użyj innych typów pamięci.
- Jak niezawodny musi być dostęp do danych?
- Jeśli podstawowe funkcje aplikacji wymagają określonych danych, np. podczas uruchamiania aplikacji, umieść te dane w katalogu pamięci wewnętrznej lub w bazie danych. Pliki specyficzne dla aplikacji przechowywane w pamięci zewnętrznej nie zawsze są dostępne, ponieważ niektóre urządzenia umożliwiają użytkownikom usunięcie fizycznego urządzenia odpowiadającego pamięci zewnętrznej.
- Jakiego rodzaju dane chcesz przechowywać?
- Jeśli masz dane, które są istotne tylko dla Twojej aplikacji, użyj pamięci specyficznej dla aplikacji. W przypadku treści multimedialnych, które można udostępniać, używaj pamięci współdzielonej, aby inne aplikacje mogły uzyskać do nich dostęp. W przypadku danych strukturalnych użyj ustawień (w przypadku danych typu klucz-wartość) lub bazy danych (w przypadku danych zawierających więcej niż 2 kolumny).
- Czy dane mają być prywatne dla Twojej aplikacji?
- Do przechowywania danych wrażliwych, do których nie powinna mieć dostępu żadna inna aplikacja, używaj pamięci wewnętrznej, ustawień lub bazy danych. Pamięć wewnętrzna ma dodatkową zaletę, jaką jest ukrywanie danych przed użytkownikami.
Kategorie lokalizacji miejsc przechowywania danych
Android udostępnia 2 rodzaje fizycznych lokalizacji pamięci: pamięć wewnętrzną i pamięć zewnętrzną. Na większości urządzeń pamięć wewnętrzna jest mniejsza niż zewnętrzna. Pamięć wewnętrzna jest jednak zawsze dostępna na wszystkich urządzeniach, co sprawia, że jest bardziej niezawodnym miejscem do przechowywania danych, od których zależy działanie aplikacji.
Woluminy wymienne, takie jak karta SD, są widoczne w systemie plików jako część pamięci zewnętrznej. Android reprezentuje te urządzenia za pomocą ścieżki, np./sdcard
.
Aplikacje są domyślnie przechowywane w pamięci wewnętrznej. Jeśli jednak rozmiar pakietu APK jest bardzo duży, możesz w pliku manifestu aplikacji wskazać, że ma być ona instalowana w pamięci zewnętrznej:
<manifest ... android:installLocation="preferExternal"> ... </manifest>
Uprawnienia i dostęp do pamięci zewnętrznej
Android definiuje te uprawnienia związane z pamięcią:READ_EXTERNAL_STORAGE
,WRITE_EXTERNAL_STORAGE
i MANAGE_EXTERNAL_STORAGE
.
W starszych wersjach Androida aplikacje musiały deklarować uprawnienie READ_EXTERNAL_STORAGE
, aby uzyskać dostęp do dowolnego pliku poza katalogami specyficznymi dla aplikacji w pamięci zewnętrznej.
Aplikacje musiały też deklarować uprawnienie WRITE_EXTERNAL_STORAGE
do zapisywania dowolnych plików poza katalogiem aplikacji.
Nowsze wersje Androida w większym stopniu opierają się na przeznaczeniu pliku niż na jego lokalizacji, aby określić, czy aplikacja może uzyskać dostęp do danego pliku i zapisywać w nim dane. W szczególności, jeśli Twoja aplikacja jest kierowana na Androida 11 (API na poziomie 30) lub nowszego, uprawnienie WRITE_EXTERNAL_STORAGE
nie ma wpływu na dostęp aplikacji do pamięci. Ten model przechowywania oparty na przeznaczeniu zwiększa prywatność użytkowników, ponieważ aplikacje mają dostęp tylko do tych obszarów systemu plików urządzenia, z których faktycznie korzystają.
Android 11 wprowadza uprawnienie MANAGE_EXTERNAL_STORAGE
, które zapewnia dostęp do zapisu plików poza katalogiem aplikacji i MediaStore
. Więcej informacji o tych uprawnieniach i o tym, dlaczego większość aplikacji nie musi ich deklarować, aby realizować swoje przypadki użycia, znajdziesz w przewodniku na temat zarządzania wszystkimi plikami na urządzeniu pamięci masowej.
Ograniczony dostęp do miejsca na dane
Aby dać użytkownikom większą kontrolę nad plikami i ograniczyć ich nadmiar, aplikacje kierowane na Androida 10 (interfejs API na poziomie 29) i nowsze wersje mają domyślnie ograniczony dostęp do pamięci zewnętrznej, czyli ograniczony dostęp do miejsca na dane. Takie aplikacje mają dostęp tylko do katalogu aplikacji w pamięci zewnętrznej oraz do określonych typów multimediów utworzonych przez aplikację.
Korzystaj z ograniczonego dostępu do miejsca na dane, chyba że aplikacja potrzebuje dostępu do pliku, który jest przechowywany poza katalogiem przypisanym do aplikacji i poza katalogiem, do którego mogą uzyskać dostęp interfejsy MediaStore
API. Jeśli przechowujesz pliki specyficzne dla aplikacji w pamięci zewnętrznej, możesz ułatwić sobie przejście na ograniczony dostęp do miejsca na dane, umieszczając te pliki w katalogu specyficznym dla aplikacji w pamięci zewnętrznej. Dzięki temu aplikacja zachowa dostęp do tych plików, gdy włączysz pamięć o ograniczonym zakresie.
Aby przygotować aplikację do korzystania z pamięci o ograniczonym zakresie, zapoznaj się z przewodnikiem Sprawdzone metody i przypadki użycia pamięci. Jeśli Twoja aplikacja ma inne zastosowanie, które nie jest objęte zakresem pamięci, prześlij prośbę o dodanie funkcji. Możesz tymczasowo zrezygnować z używania pamięci o ograniczonym zakresie.
Wyświetlanie plików na urządzeniu
Aby wyświetlić pliki zapisane na urządzeniu, użyj Eksploratora plików urządzenia w Android Studio.
Dodatkowe materiały
Więcej informacji o przechowywaniu danych znajdziesz w tych materiałach.