Aby zapewnić użytkownikom większą kontrolę nad plikami i ograniczyć porządek w plikach, W Androidzie 10 wprowadziliśmy nowy model pamięci masowej dla aplikacji ograniczonego miejsca na dane. Ograniczone zmiany miejsca na dane sposób przechowywania przez aplikacje plików w pamięci zewnętrznej urządzenia i uzyskiwania do nich dostępu. Aby Ci pomóc przenieść aplikację, aby obsługiwała pamięć o ograniczonym zakresie, postępuj zgodnie ze sprawdzonymi metodami dotyczącymi typowych przypadków użycia miejsca na dane opisanych w tym przewodniku. Przypadki użycia są uporządkowane na 2 kategorie: obsługę plików multimedialnych i obsługę plików multimedialnych pliki inne niż multimedialne.
Aby dowiedzieć się więcej o przechowywaniu plików i dostępie do nich na Androidzie, przeczytaj artykuł na temat miejsca na dane przewodniki szkoleniowe.
Obsługa plików multimedialnych
W tej sekcji opisano niektóre typowe przypadki użycia plików multimedialnych (wideo, audio i wideo) oraz objaśnia ogólne podejście których może używać aplikacja. Podsumowanie tych przypadków użycia znajdziesz w tabeli poniżej. w każdej z sekcji, w której znajdziesz więcej informacji.
Przypadek użycia | Podsumowanie |
---|---|
Pokaż wszystkie pliki graficzne lub wideo | Zrób to samo w przypadku wszystkich wersji Androida. |
Wyświetlać obrazy lub filmy z konkretnego | Zrób to samo w przypadku wszystkich wersji Androida. |
Uzyskuj dostęp do informacji o lokalizacji z: zdjęcia | Jeśli aplikacja korzysta z ograniczonego miejsca na dane, użyj jednej metody. Użyj innego jeśli aplikacja zrezygnuje z korzystania z pamięci określonego typu. |
Określanie lokalizacji zapisu nowo pobranych plików | Jeśli aplikacja korzysta z ograniczonego miejsca na dane, użyj jednej metody. Użyj innego jeśli aplikacja zrezygnuje z korzystania z pamięci określonego typu. |
Eksportowanie plików multimedialnych użytkowników na urządzenie | Zrób to samo w przypadku wszystkich wersji Androida. |
Zmodyfikuj lub usuń wiele plików multimedialnych w w ramach jednej operacji. | W Androidzie 11 stosuj jedną metodę. Rezygnowanie z funkcji „Ograniczone” na Androidzie 10 i używać tej metody w Androidzie 9 i starszych wersjach. |
Zaimportuj pojedynczy obraz, który został już | Zrób to samo w przypadku wszystkich wersji Androida. |
Robienie jednego zdjęcia | Zrób to samo w przypadku wszystkich wersji Androida. |
Udostępnianie plików multimedialnych innym aplikacjom | Zrób to samo w przypadku wszystkich wersji Androida. |
Udostępnianie plików multimedialnych określonej aplikacji | Zrób to samo w przypadku wszystkich wersji Androida. |
Uzyskiwanie dostępu do plików z kodu lub bibliotek korzystające z bezpośrednich ścieżek do plików | W Androidzie 11 stosuj jedną metodę. Rezygnowanie z funkcji „Ograniczone” na Androidzie 10 i używać tej metody w Androidzie 9 i starszych wersjach. |
Pokazuj pliki graficzne lub wideo z kilku folderów
Tworzenie zapytania do kolekcji multimediów
za pomocą query()
API. Aby filtrować lub sortować pliki multimedialne, dostosuj te ustawienia: projection
, selection
,
Parametry selectionArgs
i sortOrder
.
Pokaż obrazy lub filmy z określonego folderu
Użyj tej metody:
- Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji,
poproś o
READ_EXTERNAL_STORAGE
uprawnienia. - Pobierz pliki multimedialne na podstawie wartości atrybutu
MediaColumns.DATA
zawierający bezwzględną ścieżkę systemu plików do elementu multimedialnego na dysku.
Uwaga: gdy otworzysz istniejący plik multimedialny, możesz użyć wartości
z DATA
kolumnę logiczną. Wynika to z faktu, że ta wartość ma prawidłową ścieżkę pliku.
Nie zakładaj jednak, że plik jest zawsze dostępny. Przygotuj się na obsługę klienta
jakie mogą wystąpić błędy wejścia-wyjścia opartego na plikach.
Aby utworzyć lub zaktualizować plik multimedialny, nie używaj
DATA
. Zamiast tego używaj interfejsów DISPLAY_NAME
i
Kolumny: RELATIVE_PATH
.
Uzyskiwanie dostępu do informacji o lokalizacji ze zdjęć
Jeśli aplikacja korzysta z pamięci w zakresie, wykonaj czynności opisane w sekcji Informacje o lokalizacji na zdjęciach. w przewodniku po pamięci masowej.
Określ lokalizację zapisu nowo pobranych plików
Jeśli Twoja aplikacja korzysta z ograniczonego miejsca na dane, zwróć uwagę na lokalizację, w której chcesz ją udostępniać. przechowywania pobranych plików multimedialnych.
Jeśli inne aplikacje wymagają dostępu do plików, rozważ użycie dobrze zdefiniowanych multimediów kolekcji do pobrania lub kolekcji dokumentów.
W Androidzie 11 i nowszych pliki wewnątrz aplikacji zewnętrznej
katalogu nie są dostępne dla innych aplikacji, nawet jeśli używasz DownloadManager
do
aby pobrać te pliki.
Eksportowanie plików multimedialnych użytkowników na urządzenie
Zdefiniuj odpowiednią domyślną lokalizację do przechowywania multimediów użytkownika pliki:
- Zezwalaj użytkownikom na wybór, czy ich pliki multimedialne mają być odczytywane przez inne aplikacje lub nie, korzystając z pamięci-właściwej dla aplikacji lub pamięci współdzielonej.
- Zezwalaj użytkownikom na eksportowanie plików z katalogów aplikacji do bardziej ogólnej lokalizacji. Używaj kolekcji obrazów, filmów i dźwięku w MediaStore, aby eksportować pliki multimedialne do do galerii na urządzeniu.
Modyfikowanie lub usuwanie wielu plików multimedialnych w ramach jednej operacji
Stosuj logikę na podstawie wersji Androida, na których działa Twoja aplikacja.
Działa na Androidzie 11
Użyj tej metody:
- Utwórz intencję oczekującą dla żądania zapisu lub usunięcia w aplikacji za pomocą funkcji
MediaStore.createWriteRequest()
lubMediaStore.createTrashRequest()
a następnie poproś użytkownika o pozwolenie na edycję zestawu plików, wywołując go intencji. Oceń odpowiedź użytkownika:
- Jeśli uprawnienia zostały przyznane, kontynuuj operację modyfikowania lub usuwania.
- Jeśli uprawnienia nie zostały przyznane, wyjaśnij użytkownikowi, dlaczego funkcja aplikacja potrzebuje tych uprawnień.
Dowiedz się więcej o zarządzaniu grupami multimediów plików za pomocą tych metod dostępnych w Androidzie 11 i nowszych.
Działa na Androidzie 10
Jeśli Twoja aplikacja jest kierowana na Androida 10 (poziom interfejsu API 29), zrezygnuj z zakresu miejsca na dane i nadal korzystać z tego podejścia w Androidzie 9 lub niższy, aby wykonać tę operację.
działa na Androidzie 9 lub starszym,
Użyj tej metody:
- Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji,
poproś o
WRITE_EXTERNAL_STORAGE
uprawnienia. - Modyfikowanie przy użyciu interfejsu API
MediaStore
lub usuń pliki multimedialne.
Zaimportuj jeden obraz, który już istnieje
Jeśli chcesz zaimportować pojedynczy obraz, który już istnieje (np. jako zdjęcie profilowe użytkownika), aplikacja może użyć własnego interfejsu lub można użyć selektora systemowego.
Prezentowanie własnego interfejsu
Użyj tej metody:
- Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji,
poproś o
READ_EXTERNAL_STORAGE
uprawnienia. - Korzystanie z
query()
Interfejs API do wysyłania zapytań do kolekcji multimediów. - Wyświetlaj wyniki w niestandardowym interfejsie aplikacji.
Użyj selektora systemowego
Korzystanie z ACTION_GET_CONTENT
który prosi użytkownika o wybranie obrazu do zaimportowania.
Jeśli chcesz filtrować typy obrazów, które selektor systemowy przedstawia
użytkownika do wyboru,
setType()
lub EXTRA_MIME_TYPES
.
Robienie jednego zdjęcia
Gdy chcesz przechwycić pojedynczy obraz do użycia w aplikacji (np.
jako zdjęcie w profilu użytkownika), użyj funkcji
ACTION_IMAGE_CAPTURE
nakłaniając użytkownika do zrobienia zdjęcia aparatem w urządzeniu. System
zapisuje zrobione zdjęcie w
MediaStore.Images
.
Udostępnianie plików multimedialnych innym aplikacjom
Użyj
insert()
, aby dodać rekordy bezpośrednio do MediaStore. Więcej informacji:
sekcji Dodaj element na
przewodnik po pamięci masowej.
Udostępnianie plików multimedialnych określonej aplikacji
Użyj komponentu FileProvider
na Androidzie zgodnie z opisem w sekcji Konfigurowanie pliku
Dostęp do plików z kodu lub bibliotek, które używają bezpośrednich ścieżek do plików
Stosuj logikę na podstawie wersji Androida, na których działa Twoja aplikacja.
Działa na Androidzie 11
Użyj tej metody:
- Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji,
poproś o
READ_EXTERNAL_STORAGE
uprawnienia. - Dostęp do plików za pomocą bezpośrednich ścieżek do plików.
Więcej informacji znajdziesz w sekcji o otwieraniu plików multimedialnych przy użyciu bezpośrednie ścieżki do plików.
Działa na Androidzie 10
Jeśli Twoja aplikacja jest kierowana na Androida 10 (poziom interfejsu API 29), zrezygnuj z zakresu miejsca na dane i nadal korzystać z tego podejścia w Androidzie 9 lub niższy, aby wykonać tę operację.
działa na Androidzie 9 lub starszym,
Użyj tej metody:
- Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji,
poproś o
WRITE_EXTERNAL_STORAGE
uprawnienia. - Dostęp do plików za pomocą bezpośrednich ścieżek do plików.
Obsługa plików innych niż multimedialne
W tej sekcji opisano niektóre typowe przypadki użycia plików innych niż multimedialne. i wyjaśnia ogólne podejście do Twojej aplikacji. Tabela poniżej podsumowuje każdy z tych przypadków użycia i zawiera linki do poszczególnych sekcji, zawiera więcej informacji.
Przypadek użycia | Podsumowanie |
---|---|
Otwieranie pliku dokumentu | Zrób to samo w przypadku wszystkich wersji Androida. |
Zapis w plikach dodatkowe woluminy miejsca na dane | W Androidzie 11 stosuj jedną metodę. Wcześniej zastosuj inne podejście wersji Androida. |
Migracja istniejących plików ze starszej wersji lokalizacja zapisu | W miarę możliwości przenieś pliki do ograniczonego zakresu pamięci. Zrezygnuj z zakresu i pamięci masowej dla Androida 10. |
Udostępnianie treści innym osobom | Zrób to samo w przypadku wszystkich wersji Androida. |
Pamięć podręczna na pliki inne niż multimedialne | Zrób to samo w przypadku wszystkich wersji Androida. |
Eksportowanie plików innych niż multimedialne na urządzenie | Jeśli aplikacja korzysta z ograniczonego miejsca na dane, użyj jednej metody. Użyj innego jeśli aplikacja zrezygnuje z zajętego zakresu pamięci. |
Otwieranie pliku dokumentu
Korzystanie z ACTION_OPEN_DOCUMENT
prosić użytkownika o wybranie pliku do otwarcia za pomocą selektora systemowego. Jeśli
chcesz filtrować typy plików, które selektor systemowy wyświetli
użytkownika do wyboru,
setType()
lub EXTRA_MIME_TYPES
.
Możesz na przykład znaleźć wszystkie pliki PDF, ODT i TXT, używając kod:
Kotlin
startActivityForResult( Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "*/*" putExtra(Intent.EXTRA_MIME_TYPES, arrayOf( "application/pdf", // .pdf "application/vnd.oasis.opendocument.text", // .odt "text/plain" // .txt )) }, REQUEST_CODE )
Java
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] { "application/pdf", // .pdf "application/vnd.oasis.opendocument.text", // .odt "text/plain" // .txt }); startActivityForResult(intent, REQUEST_CODE);
Zapisywanie w plikach na dodatkowych woluminach pamięci masowej
Woluminy pamięci dodatkowej obejmują karty SD. Możesz uzyskać dostęp do informacji o
dla danego woluminu pamięci masowej za pomocą funkcji
StorageVolume
.
Stosuj logikę na podstawie wersji Androida, na której działa Twoja aplikacja.
Działa na Androidzie 11
Użyj tej metody:
- Użyj modelu ograniczonego miejsca na dane.
- Docelowa wersja Androida 10 (poziom interfejsu API 29) lub niższy.
- Zadeklaruj parametr
WRITE_EXTERNAL_STORAGE
uprawnienia. - Wykonaj jeden z tych rodzajów dostępu:
- Dostęp do plików przez interfejs API
MediaStore
. - Bezpośredni dostęp do ścieżek plików przy użyciu interfejsów API takich jak
File
lubfopen()
.
- Dostęp do plików przez interfejs API
Działa na starszych wersjach
Korzystanie z opcji Dostęp do pamięci masowej Framework, która umożliwia użytkownikom wybierz lokalizację w dodatkowej pamięci masowej, w której aplikacja może zapisywać .
Przenoszenie istniejących plików ze starszej lokalizacji w pamięci masowej
Katalog jest uznawany za starszą lokalizację miejsca na dane, jeśli nie jest katalogu aplikacji lub publicznego katalogu udostępnionego. Jeśli aplikacja tworzy lub korzysta z plików w starszej lokalizacji przechowywania, zalecamy migrację w lokalizacjach, które są dostępne w ramach określonego zakresu pamięci, i tworzą niezbędne zmiany w aplikacji do pracy z plikami w pamięci w zakresie.
Zachowywanie dostępu do starszej lokalizacji pamięci na potrzeby migracji danych
Aplikacja musi zachowywać dostęp do starszej lokalizacji pamięci, aby umożliwić przenieś wszystkie pliki aplikacji do lokalizacji, które są dostępne w zakresie pamięci masowej. należy zastosować w zależności od docelowego poziomu interfejsu API aplikacji.
Jeśli Twoja aplikacja jest kierowana na Androida 11
Ustaw parametr
preserveLegacyExternalStorage
ustaw flagę natrue
, aby zachować starszą pamięć model, więc że aplikacja może przenieść dane użytkownika po przejściu na nową wersję aplikacji kierowanej na Androida 11.Przejdź dalej zrezygnować z ograniczonego miejsca na dane, aby aplikacja nadal ma dostęp do plików w starszej lokalizacji pamięci na Urządzenia z Androidem 10.
Jeśli Twoja aplikacja jest kierowana na Androida 10
Zrezygnuj z ograniczonego miejsca na dane, aby ułatwić sobie Dbaj o zachowanie aplikacji w różnych wersjach Androida.
Migracja danych aplikacji
Gdy aplikacja będzie gotowa do migracji, użyj tej metody:
- Kieruj reklamy na Androida w wersji 10 lub starszej.
- Zrezygnuj z ograniczonego miejsca na dane, aby aplikacja ma dostęp do plików, które trzeba przenieść.
-
Wdróż kod, który korzysta z interfejsu API
File
do przenoszenia plików aktualnej lokalizacji poniżej/sdcard/
do lokalizacji, która jest dostępna z ograniczonym miejscem na dane:- Przenieś wszystkie pliki aplikacji prywatnych do katalogu zwracanego przez metodę
getExternalFilesDir()
. - Przenieś wszystkie udostępnione pliki inne niż multimedia do podkatalogu przeznaczonego dla aplikacji
w katalogu
Downloads/
.
- Przenieś wszystkie pliki aplikacji prywatnych do katalogu zwracanego przez metodę
- Usuń starsze katalogi pamięci aplikacji z
Katalog
/sdcard/
.
Gdy użytkownicy zainstalują nową wersję Twojej aplikacji, uzupełnią dane na ich urządzeniach. Proces migracji możesz monitorować w Twoją bazę użytkowników za pomocą zdarzenia analitycznego.
Po przeniesieniu danych przez użytkowników opublikuj kolejną aktualizację aplikacji, przy czym kierujesz ją na Androida 11.
Udostępnianie treści innym aplikacjom
Aby udostępnić pliki aplikacji jeszcze jednej aplikacji, użyj
FileProvider
Na potrzeby aplikacji, które muszą być udostępniane
plików, zalecamy zastosowanie
dostawcy dla każdej aplikacji.
synchronizacji danych w miarę dodawania aplikacji do kolekcji.
Buforuj pliki inne niż multimedialne
Wybór metody zależy od typu potrzebnych plików do pamięci podręcznej.
- Małe pliki lub pliki zawierające informacje poufne: użyj
Context#getCacheDir()
. - Duże pliki lub pliki, które nie zawierają informacji poufnych: użyj
Context#getExternalCacheDir()
.
Eksportowanie plików innych niż multimedialne na urządzenie
Określ prawidłową lokalizację domyślną do przechowywania zasobów innych niż medialne . Zezwalaj użytkownikom na eksportowanie plików z katalogów aplikacji do bardziej ogólnej lokalizacji. Korzystaj z plików do pobrania i kolekcji dokumentów MediaStore, aby eksportować pliki inne niż multimedialne do urządzenia.
Tymczasowo zrezygnuj z miejsca na dane w zakresie
Zanim Twoja aplikacja będzie w pełni zgodna z ograniczonym miejscem na dane, możesz tymczasowo zrezygnować z tej funkcji zarówno w testach, jak i w produkcji.
Zrezygnuj z testów
Na Androidzie 10 (poziom interfejsu API 29) i nowszym testy aplikacji są przeprowadzane w pamięci masowej w trybie piaskownicy. Ta piaskownica uniemożliwia aplikacji dostęp do plików spoza domeny katalogu aplikacji i publicznie udostępnianych katalogów.
Jeśli test wygeneruje pliki dla hosta, takie jak zrzuty ekranu, dane debugowania,
danych o pokryciu czy skuteczności. Możesz zapisywać pliki w środowisku globalnym,
i katalogów. Aby to zrobić, dodaj tę flagę do odpowiedniej uprzęży, która:
wywołuje funkcję am instrument
:
-e no-isolated-storage 1
Ta flaga wpływa na wszystkie zachowanie instrumentowanego przypadku testowego i wpływa na wszystkie
wywołał kod testowy. Dlatego korzystając z tej flagi, nie można zweryfikować poprawności
kompatybilności aplikacji z pamięcią zakresu. Jeśli chcesz przetestować dane wyjściowe, lepiej jest użyć
zapisywać w pamięci w zakresie aplikacji dostępnej dla powłoki czytelniczej. Następnie możesz pobrać
katalog ograniczony do aplikacji. Aby określić katalog, z którego ma zostać pobrany plik, wywołaj
getExternalMediaDirs()
Rezygnacja w wersji produkcyjnej aplikacji
Jeśli Twoja aplikacja jest kierowana na Androida 10 (poziom interfejsu API 29) lub starszego, możesz tymczasowo zrezygnować z tej opcji
poza limitem miejsca na dane w wersji produkcyjnej. Jeśli kierujesz na
Android 10 musisz jednak ustawić wartość
Z requestLegacyExternalStorage
na true
w pliku manifestu aplikacji:
<manifest ... > <!-- This attribute is "false" by default on apps targeting Android 10. --> <application android:requestLegacyExternalStorage="true" ... > ... </application> </manifest>
Aby przetestować działanie aplikacji kierowanej na Androida 10 lub starszego, gdy:
używając ograniczonego miejsca na dane, możesz wyrazić zgodę na to działanie, ustawiając wartość
requestLegacyExternalStorage
do false
. Jeśli testujesz na urządzeniu, które
ma Androida 11, możesz też użyć zgodności aplikacji
flagi, by przetestować
zachowanie aplikacji niezależnie od tego, czy jest ona dostępna w ograniczonym zakresie.
Dodatkowe materiały
Więcej informacji o miejscu na dane na Androidzie znajdziesz w tych materiałach: