Moduł MediaProvider

Moduł MediaProvider optymalizuje indeksowane metadane (audio, wideo i obrazy z kart SD i urządzeń USB) i udostępnia te dane aplikacjom za pomocą publicznych interfejsów API MediaStore. Aby chronić prywatność użytkowników, moduł MediaProvider wymusza model zabezpieczeń pamięci zakresowej wprowadzony w Androidzie 10, który obejmuje redagowanie poufnych metadanych lokalizacji. Ten moduł można aktualizować, co pozwala Androidowi szybciej reagować na problemy z bezpieczeństwem (chroniąc wrażliwe dane użytkowników) i szybciej dodawać nowe formaty multimediów (zapewniając spójność zarówno użytkownikom, jak i deweloperom).

Zmiany w Androidzie 10

W Androidzie 10 wprowadziliśmy kilka ulepszeń związanych z identyfikowaniem i wyodrębnianiem danych z plików multimedialnych, w szczególności:

  • określanie typu treści pliku na podstawie pierwszej części typu MIME pliku; Na przykład system operacyjny wie, że zarówno image/png, jak i image/x-newly-invented-format to obrazy, i może w związku z tym dokładnie opisać odpowiednie uprawnienia użytkownikowi.

  • Określanie typu MIME tylko na podstawie rozszerzenia pliku (bez używania wykrywania treści, aby uniknąć problemów z bezpieczeństwem).

  • Określanie typu MIME dowolnego pliku za pomocą kombinacji mapowań z Debiana Linux i Androida.

  • Zwracanie odpowiednich danych z plików video/*audio/* (za pomocą MediaMetadataRetriever) oraz plików image/* (za pomocą ExifInterface).

Zmiany w Androidzie 11

W Androidzie 11 moduł MediaProvider wykorzystuje zmiany wprowadzone w Androidzie 10 i zawiera te ulepszenia:

  • Ulepszenia indeksowania. Moduł MediaProvider indeksuje teraz metadane, porównując dostępne metadane z publicznymi interfejsami API MediaStore. Zmiany obejmują:

    • Nowa kolumna is_favorite i argument QUERY_ARG_MATCH_FAVORITE, które umożliwiają aplikacjom w stylu galerii szybkie filtrowanie multimediów na podstawie tej kolumny.

    • Indeksowanie metadanych przestrzeni kolorów.

    • Nowa kolumna „is_trashed” i argument QUERY_ARG_MATCH_TRASHED, które umożliwiają aplikacjom w stylu galerii filtrowanie na podstawie tej kolumny.

    • Nowe interfejsy API, które umożliwiają zbiorcze modyfikowanie wielu elementów za pomocą jednego okna dialogowego, w tym createDeleteRequest(), createFavoriteRequest(), createTrashRequest()createWriteRequest().

    • Nowe kolumny GENERATION_ADDEDGENERATION_MODIFIED, które umożliwiają szybkie i niezawodne wykrywanie zmian, jakie zaszły od poprzedniego punktu synchronizacji.

    • Nowy GROUP BY publiczny interfejs API do używania z dodatkowymi kolumnami metadanych, które nie zostały wymienione powyżej.

  • Ulepszenie ExifInterface w celu wyodrębniania metadanych z kontenerów PNG i WebP.

  • Ulepszenia SystemUI, które umożliwiają zapisywanie DateTimeOriginal metadanych na zrzutach ekranu.

Możesz też dostosować MediaProvider, dodając nowe formaty multimediów, oznaczając, które urządzenia pamięci masowej mają być indeksowane, a nawet zastępując stos MTP. Więcej informacji znajdziesz w sekcji Dostosowywanie.

Granica modułu

Android 11 przenosi cały kod z packages/providers/MediaProvider do nowej lokalizacji, z wyjątkiem logiki związanej z MTP. Dodatkowo punkt frameworks/base/core/java/android/provider/MediaStore.java znajduje się teraz wewnątrz granicy modułu w punkcie packages/providers/MediaProvider.

Format pakietu

Moduł MediaProvider jest w formacie APK w APEX.

Zależności

Zależności MediaProvider są związane z dostosowaniami (tzn. jeśli dostosujesz MediaProvider, musisz mieć pewność, że Twoja implementacja spełnia wymagania związane z tym dostosowaniem).

  • Jeśli używasz niestandardowych lub niestandardowych formatów plików multimedialnych (np. formatu wygenerowanego przez aplikację Aparat konkretnego dostawcy), musisz zarejestrować każdy niestandardowy format w MimeUtils i module Media Extractor, aby umożliwić indeksowanie przez MediaProvider.

  • Aby mieć pewność, że MediaProvider indeksuje niestandardowy zestaw urządzeń pamięci masowej (takich jak gniazda kart SD i porty USB) używanych w implementacji StorageManagerService, ustaw flagę VolumeInfo.MOUNT_FLAG_INDEXABLE.

  • Jeśli używasz niestandardowej (nie pochodzącej z AOSP) implementacji MTP, upewnij się, że opiera się ona wyłącznie na publicznych i systemowych interfejsach API, aby umożliwić jej interakcję z MediaStore.

Dostosowywanie

Możesz teraz dodawać nowe formaty multimediów, wpływać na to, które urządzenia pamięci masowej są indeksowane, i zastępować stos MTP.

  • Niestandardowe formaty multimediów W przypadku każdego nowego niestandardowego formatu multimediów musisz podać mapowanie unikalnego rozszerzenia pliku na typ MIME. Gorąco zachęcamy do przejścia procesu rejestracji w IANA.

    • Nie możesz ponownie zdefiniować rozszerzenia ani typu MIME, które są już zdefiniowane w AOSP.

    • W przypadku plików video/*audio/* MediaProvider nadal konsultuje się z MediaMetadataRetriever. Użyj ekstraktorów multimediów z Androida 10, aby zwracać metadane w przypadku formatów niestandardowych.

    • W przypadku plików image/* MediaProvider nadal będzie standardowo używać Exif do metadanych. Możesz rozszerzyć android.media.ExifInterface, aby wyodrębniać i zwracać Exif metadane dla dowolnych formatów obrazów niestandardowych.

  • Flaga indeksowania urządzeń pamięci masowej. MediaProvider indeksuje wszystkie woluminy zwrócone przez StorageManager.getStorageVolumes(), gdzie StorageVolume.getMediaStoreVolumeName() nie jest wartością null. Możesz dostosować listę zwracanych woluminów, aby wpływać na to, co jest indeksowane, ale odradzamy uwzględnianie woluminów tymczasowych (takich jak dyski USB OTG).

  • Zastąpienie stosu MTP. Android 11 umieszcza stos MTP całkowicie poza granicami modułu i zapewnia, że działa on w oparciu o publiczne interfejsy API.

Testowanie

Funkcjonalność MediaProvider możesz sprawdzić za pomocą tych testów:

  • Aby sprawdzić działanie publicznych interfejsów API MediaStore, użyj testów w CtsProviderTestCasespakiecie Android Compatibility Test Suite (CTS).

  • Aby sprawdzić działanie wewnętrznych elementów MediaProvider, użyj testów w MediaProviderTests.

Aby uruchomić oba zestawy testów jednocześnie, użyj tego polecenia: atest

atest --test-mapping packages/providers/MediaProvider