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. 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:

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

.

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:

  1. Utwórz intencję oczekującą dla żądania zapisu lub usunięcia w aplikacji za pomocą funkcji MediaStore.createWriteRequest() lub MediaStore.createTrashRequest() a następnie poproś użytkownika o pozwolenie na edycję zestawu plików, wywołując go intencji.
  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 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:

  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. 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:

  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. Korzystanie z query() Interfejs API do wysyłania zapytań do kolekcji multimediów.
  3. 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:

  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. 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:

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

  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. 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 lub fopen().

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
  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ć sobie Dbaj o zachowanie aplikacji w różnych wersjach Androida.

Migracja danych aplikacji

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

  1. Kieruj reklamy na Androida w wersji 10 lub starszej.
  2. Zrezygnuj z ograniczonego miejsca na dane, aby aplikacja ma dostęp do plików, które trzeba przenieść.
  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 prywatnych do katalogu zwracanego przez metodę getExternalFilesDir() .
    2. Przenieś wszystkie udostępnione pliki inne niż multimedia do podkatalogu przeznaczonego dla aplikacji w katalogu Downloads/.
  4. 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.

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:

Posty na blogu