Przypadki użycia i sprawdzone metody dotyczące miejsca na dane na Androidzie

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. Ograniczony dostęp do pamięci zmienia sposób, w jaki aplikacje przechowują pliki i do nich uzyskują dostęp na zewnętrznej pamięci urządzenia. Aby ułatwić sobie migrację aplikacji na obsługę ograniczonego miejsca na dane, stosuj sprawdzone metody dotyczące typowych przypadków użycia miejsca na dane opisane w tym przewodniku. Przypadki użycia są podzielone na 2 kategorie: obsługa plików multimedialnychobsługa plików niemultimedialnych.

Często aplikacja tworzy pliki, z których inne aplikacje nie potrzebują dostępu. nie powinny uzyskać dostępu. System zapewnia lokalizacji pamięci dla poszczególnych aplikacji, .

Więcej informacji o przechowywaniu plików i dostępie do nich na urządzeniach z Androidem znajdziesz w przewodnikach dotyczących miejsca na dane.

Obsługa plików multimedialnych

W tej sekcji opisaliśmy kilka typowych przypadków użycia dotyczących obsługi plików multimedialnych (wideo, obrazów i dźwięku) oraz ogólne podejście, którego może używać Twoja 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 Stosuj to samo podejście we wszystkich wersjach Androida.
Wyświetlanie obrazów lub filmów z określonego folderu Stosuj to samo podejście we wszystkich wersjach Androida.
Dostęp do informacji o lokalizacji ze zdjęć 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.
Definiowanie lokalizacji przechowywania nowych pobranych plików Jeśli Twoja aplikacja korzysta z ograniczonego dostępu do miejsca na dane, zastosuj jedno z tych podejść. Użyj innego jeśli aplikacja zrezygnuje z zajętego zakresu pamięci.
Eksportowanie plików multimediów użytkownika na urządzenie Zrób to samo w przypadku wszystkich wersji Androida.
Zmodyfikuj lub usuń wiele plików multimedialnych w w ramach jednej operacji. Użyj jednego podejścia w przypadku Androida 11. Rezygnowanie z funkcji „Ograniczone” na Androidzie 10 i używać tej metody w Androidzie 9 i starszych wersjach.
Importowanie pojedynczego obrazu, który już istnieje Stosuj to samo podejście we wszystkich wersjach Androida.
Robienie jednego zdjęcia Zrób to samo w przypadku wszystkich wersji Androida.
Udostępnianie plików multimedialnych za pomocą innych aplikacji Zrób to samo w przypadku wszystkich wersji Androida.
Udostępnianie plików multimedialnych za pomocą konkretnej aplikacji Stosuj to samo podejście we wszystkich wersjach Androida.
Uzyskiwanie dostępu do plików z kodu lub bibliotek, które używają bezpośrednich ścieżek plików Użyj jednego podejścia w przypadku Androida 11. Rezygnowanie z funkcji „Ograniczone” na Androidzie 10 i używać tej metody w Androidzie 9 i starszych wersjach.

Wyświetlanie plików z obrazami lub filmami z wielu folderów

Wysyłanie zapytania do kolekcji multimediów za pomocą interfejsu API query(). 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:

  1. Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji, poproś o READ_EXTERNAL_STORAGE uprawnienia.
  2. Pobierz pliki multimedialne na podstawie wartości parametru MediaColumns.DATA, który zawiera bezwzględną ścieżkę do pliku multimedialnego na dysku.

Uwaga: gdy uzyskujesz dostęp do istniejącego pliku multimedialnego, możesz użyć wartości w kolumnie DATA w swojej logice. Wynika to z faktu, że ta wartość ma prawidłową ścieżkę pliku. Nie zakładaj jednak, że plik jest zawsze dostępny. Bądź przygotowany na ewentualne błędy we/wy związane z plikami.

Aby utworzyć lub zaktualizować plik multimedialny, nie używaj DATA. Zamiast tego użyj kolumn DISPLAY_NAMERELATIVE_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, pamiętaj o tym, gdzie zapisujesz pobrane pliki multimedialne.

Jeśli inne aplikacje wymagają dostępu do plików, rozważ użycie dobrze zdefiniowanych kolekcji multimediów na potrzeby pobierania 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 multimediów użytkownika na urządzenie

Określ odpowiednią domyślną lokalizację do przechowywania plików multimedialnych użytkownika:

.

Zmodyfikuj lub usuń wiele plików multimedialnych w ramach jednej operacji

Uwzględnij logikę opartą na wersjach Androida, na których działa Twoja aplikacja.

Działa na Androidzie 11

Skorzystaj z tego podejścia:

  1. Utwórz oczekujący zamiar dla żądania zapisu lub usunięcia w aplikacji za pomocą MediaStore.createWriteRequest() lub MediaStore.createTrashRequest(), a następnie poproś użytkownika o zezwolenie na edycję zbioru plików, wywołując ten zamiar.
  2. 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 plików multimedialnych za pomocą tych metod, które są dostępne w Androidzie 11 i nowszych wersjach.

Działa na Androidzie 10

Jeśli Twoja aplikacja jest kierowana na Androida 10 (poziom interfejsu API 29), wyłącz ograniczone miejsce na dane i wykonaj tę operację w sposób odpowiedni dla Androida 9 i starszych wersji.

działa na Androidzie 9 lub starszym,

Użyj tej metody:

  1. Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji, poproś o WRITE_EXTERNAL_STORAGE uprawnienia.
  2. Aby modyfikować lub usuwać pliki multimedialne, użyj interfejsu API MediaStore.

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.

prezentować własny interfejs użytkownika;

Użyj tej metody:

  1. Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji, poproś o READ_EXTERNAL_STORAGE uprawnienia.
  2. Użyj interfejsu API query(), aby wysłać zapytanie do kolekcji multimediów.
  3. Wyświetlanie wyników 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 odfiltrować typy obrazów, które system udostępnia użytkownikowi, możesz użyć setType() lub EXTRA_MIME_TYPES.

Robienie pojedynczego 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 za pomocą innych aplikacji

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 urządzeniu z Androidem zgodnie z opisem w przewodniku Konfigurowanie udostępniania plików.

Dostęp do plików z kodu lub bibliotek, które używają bezpośrednich ścieżek plików

Uwzględnij logikę opartą na wersjach Androida, na których działa Twoja aplikacja.

Działa na Androidzie 11

Użyj tej metody:

  1. Zgodnie ze sprawdzonymi metodami opisanymi w prośbie o uprawnienia aplikacji poproś o uprawnienie READ_EXTERNAL_STORAGE.
  2. 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), wyłącz ograniczone miejsce na dane i wykonaj tę operację w sposób odpowiedni dla Androida 9 i starszych wersji.

działa na Androidzie 9 lub starszym,

Użyj tej metody:

  1. Postępując zgodnie ze sprawdzonymi metodami opisanymi w artykule Wysyłanie próśb o uprawnienia aplikacji, poproś o WRITE_EXTERNAL_STORAGE uprawnienia.
  2. Dostęp do plików za pomocą bezpośrednich ścieżek do plików.

Obsługa plików niemultimediów

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 zawiera podsumowanie tych przypadków użycia oraz linki do sekcji, w których znajdziesz więcej informacji.

Przypadek użycia Podsumowanie
Otwieranie pliku dokumentu Stosuj to samo podejście we wszystkich wersjach Androida.
Zapis w plikach dodatkowe woluminy miejsca na dane Użyj jednego podejścia w przypadku Androida 11. 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 aplikacjom Stosuj to samo podejście we wszystkich wersjach Androida.
Pamięć podręczna na pliki inne niż multimedialne Stosuj to samo podejście we wszystkich wersjach Androida.
Eksportowanie plików innych niż multimedialne na urządzenie Jeśli Twoja aplikacja korzysta z ograniczonego dostępu do miejsca na dane, zastosuj jedno z tych podejść. Jeśli Twoja aplikacja nie korzysta z ograniczonego dostępu do miejsca na dane, zastosuj inne podejście.

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 za pomocą tego kodu:

KotlinJava
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
      )
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 danych do plików na woluminach pamięci dodatkowej,

Do pamięci dodatkowej należą karty SD. Informacje o danym woluminie pamięci masowej można uzyskać, korzystając z klasy StorageVolume.

Włącz logikę opartą na wersji Androida, na której działa Twoja aplikacja.

Działa na Androidzie 11

Użyj tej metody:

  1. Użyj modelu ograniczonego miejsca na dane.
  2. Docelowa wersja Androida 10 (poziom interfejsu API 29) lub niższy.
  3. Zadeklaruj parametr WRITE_EXTERNAL_STORAGE uprawnienia.
  4. Wybierz jeden z tych typów dostępu:
    • Dostęp do plików za pomocą interfejsu MediaStore API.
    • Bezpośredni dostęp do ścieżek plików przy użyciu interfejsów API takich jak File lub fopen().

Uruchamianie w 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 Twoja aplikacja tworzy lub zużywa pliki w starszej lokalizacji pamięci, zalecamy przeniesienie plików aplikacji do lokalizacji dostępnych za pomocą ograniczonej pamięci i wprowadzenie niezbędnych zmian w aplikacji, aby mogła pracować z plikami w ograniczonej pamięci.

Zachowanie dostępu do starszego miejsca na dane 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
  1. Ustaw parametr preserveLegacyExternalStorage ustaw flagę na true, 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.

  2. 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ć zachowanie zachowania aplikacji w różnych wersjach Androida.

Migracja danych aplikacji

Gdy aplikacja będzie gotowa do migracji, użyj tej metody:

  1. kierować aplikację na Androida 10 lub starszego;
  2. Wyłącz ograniczoną pamięć, aby aplikacja miała dostęp do plików, które są potrzebne do przeniesienia.
  3. 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:

    1. Przenieś wszystkie pliki aplikacji prywatnej do katalogu zwróconego przez metodę getExternalFilesDir().
    2. Przenieść wszystkie udostępnione pliki niemultimedialne do podkatalogu dedykowanego aplikacji w katalogu Downloads/.
  4. Usuń starsze katalogi pamięci aplikacji z Katalog /sdcard/.

Po zainstalowaniu nowej wersji aplikacji użytkownicy przeprowadzają na swoich urządzeniach proces migracji danych. Możesz monitorować proces migracji wśród całej grupy użytkowników, tworząc zdarzenie Analytics.

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 innej 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

Sposób, którego należy użyć, zależy od typu plików, które chcesz zapisać w pamięci podręcznej.

Eksportowanie plików innych niż multimedialne na urządzenie

Zdefiniuj odpowiednią domyślną lokalizację do przechowywania plików niemultimedialnych. Zezwalanie użytkownikom na eksportowanie plików z katalogów aplikacji do bardziej ogólnie dostępnej lokalizacji. Korzystaj z plików do pobrania i kolekcji dokumentów MediaStore, aby eksportować pliki inne niż multimedialne do urządzenia.

Obsługa plików aplikacji

Jeśli aplikacja tworzy pliki, do których inne aplikacje nie potrzebują dostępu, nie powinny uzyskać dostępu, możesz zapisać te pliki w miejsca przechowywania danych dla poszczególnych aplikacji.

Katalogi pamięci wewnętrznej

System uniemożliwia innym aplikacjom dostęp do tych lokalizacji, a na Androidzie 10 (poziom interfejsu API 29) i nowszych te lokalizacje są szyfrowane. Te lokalizacje to dobre miejsce na przechowywanie danych poufnych, do których dostęp ma tylko Twoja aplikacja.

Katalogi pamięci zewnętrznej

Jeśli w pamięci wewnętrznej jest za mało miejsca na pliki związane z aplikacją, rozważ użycie pamięci zewnętrznej. Inna aplikacja może dostępować do tych katalogów, jeśli ma odpowiednie uprawnienia, ale pliki przechowywane w tych katalogach są przeznaczone tylko do użytku Twojej aplikacji.

Na Androidzie 4.4 (poziom interfejsu API 19) lub nowszym aplikacja nie musi żądać żadnych uprawnienia związane z pamięcią i dostęp do katalogów aplikacji w zewnętrznych pamięci masowej.

Gdy użytkownik odinstaluje Twoją aplikację, pliki zapisane w pamięci aplikacji zostaną zostały usunięte, dlatego nie należy korzystać z tej przestrzeni, aby zapisać wszystkie elementy, które użytkownik chce zachować niezależnie od aplikacji.

Tymczasowe wyłączenie ograniczonego miejsca na dane

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.

Wycofanie zgody na udział w testach

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, dane dotyczące zasięgu lub dane o wydajności, możesz zapisać te pliki w katalogach globalnych. Aby to zrobić, dodaj ten parametr do odpowiedniego gniazda, które wywołuje 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. W przypadku danych testowych lepiej jest zapisywać je w miejscu przeznaczonym dla aplikacji, które jest czytelne dla powłoki. Następnie możesz pobrać katalog ograniczony do aplikacji. Aby określić, z którego katalogu mają być pobierane dane, wywołaj funkcję getExternalMediaDirs().

Rezygnacja z usługi w wersji produkcyjnej aplikacji

Jeśli Twoja aplikacja jest kierowana na Androida 10 (poziom interfejsu API 29) lub starszego, możesz tymczasowo zrezygnować z ograniczonego miejsca w wersji produkcyjnej aplikacji. Jeśli jednak kierujesz ją na Androida 10, musisz w pliku manifestu aplikacji ustawić wartość requestLegacyExternalStorage na true:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

Aby przetestować, jak aplikacja kierowana na Androida 10 lub niższą wersję działa z użyciem ograniczonego miejsca na dane, możesz włączyć to zachowanie, ustawiając wartość requestLegacyExternalStorage na false. Jeśli testujesz aplikację na urządzeniu z Androidem 11, możesz też użyć flag zgodności aplikacji, aby przetestować jej działanie z dostępem do ograniczonego miejsca na dane lub bez niego.

Dodatkowe materiały

Więcej informacji o miejscu na dane na Androidzie znajdziesz w tych materiałach:

Posty na blogu