Moduł MediaProvider

Moduł MediaProvider optymalizuje zindeksowane metadane (dźwięk, wideo i obrazy z kart SD i urządzeń USB) oraz udostępnia te dane aplikacjom za pomocą publicznych interfejsów API MediaStore. Aby chronić prywatność użytkowników, moduł MediaProvider wymusza model zabezpieczeń ograniczonego przechowywania danych wprowadzony w Androidzie 10, który obejmuje usuwanie metadanych dotyczących wrażliwych 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 programistom).

Zmiany w Androidzie 10

W Androidzie 10 wprowadzono kilka ulepszeń związanych z identyfikacją i wyodrębnianiem danych z plików multimedialnych. Oto niektóre z nich:

  • Określanie typu treści pliku na podstawie pierwszej części typu MIME pliku. System operacyjny wie na przykład, że zarówno image/png, jak i image/x-newly-invented-format to obrazy, więc może dokładnie opisać odpowiednie uprawnienia dla użytkownika końcowego.

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

  • Określanie typu MIME dowolnego pliku przy użyciu mapowania nadrzędnego systemu Debian Linux i Androida.

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

Zmiany w Androidzie 11

W Androidzie 11 moduł MediaProvider opiera się na zmianach wprowadzonych w Androidzie 10 i zawiera te ulepszenia:

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

    • Nowa kolumna is_favorite i argument QUERY_ARG_MATCH_FAVORITE 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ą zbiorczą modyfikację wielu elementów za pomocą komunikatu w oknie 1 użytkownika, w tym createDeleteRequest(), createFavoriteRequest(), createTrashRequest() i createWriteRequest().

    • Nowe kolumny GENERATION_ADDED i GENERATION_MODIFIED do szybkiego i niezawodnego wykrywania zmian, które nastąpiły od poprzedniego punktu synchronizacji.

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

  • Ulepszenie funkcji ExifInterface, która umożliwia wyodrębnianie metadanych z kontenerów PNG i WebP.

  • Usprawnienia w SystemUI zapisywania metadanych DateTimeOriginal na zrzutach ekranu.

Dodatkowo możesz teraz dostosować MediaProvider, dodając nowe formaty multimediów, oznaczając urządzenia pamięci masowej, które mają być indeksowane, a nawet zastępując stos MTP. Więcej informacji znajdziesz w artykule 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 frameworks/base/core/java/android/provider/MediaStore.java znajduje się teraz wewnątrz granicy modułu w witrynie packages/providers/MediaProvider.

Format pakietu

Moduł MediaProvider ma format APK-in-APEX.

Zależności

Zależności MediaProvider są związane z dostosowaniami (to znaczy, że jeśli dostosowujesz MediaProvider, musisz się upewnić, że implementacja spełnia zależność związaną z dostosowaniem).

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

  • Aby zapewnić indeksowanie przez MediaProvider niestandardowego zestawu 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 korzystasz z niestandardowego (nie AOSP) implementacji MTP, upewnij się, że implementacja opiera się wyłącznie na publicznych i systemowych interfejsach API, aby umożliwić interakcję z MediaStore.

Dostosowywanie

Możesz teraz dodawać nowe formaty multimediów, wpływać na indeksowanie urządzeń pamięci i zastępować stos MTP.

  • Niestandardowe formaty multimediów Dla każdego nowego niestandardowego formatu multimediów musisz określić mapowanie z unikalnego rozszerzenia pliku na typ MIME. Zdecydowanie zalecamy przestrzeganie procedury rejestracji IANA.

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

    • W przypadku plików video/*audio/* MediaProvider nadal korzysta z funkcji MediaMetadataRetriever. Użyj modułu wyodrębniania multimediów z Androida 10, aby zwrócić metadane w formatach niestandardowych.

    • W przypadku plików image/* MediaProvider kontynuuje standaryzację metadanych Exif. Możesz rozszerzyć android.media.ExifInterface, aby wyodrębniać i zwracać metadane Exif dla dowolnego niestandardowego formatu obrazu.

  • Flaga indeksowania urządzeń pamięci masowej. MediaProvider indeksuje wszystkie woluminy zwrócone przez funkcję StorageManager.getStorageVolumes(), przy czym StorageVolume.getMediaStoreVolumeName() ma wartość inną niż null. Możesz dostosować listę zwróconych woluminów, aby wpływać na to, co jest indeksowane, ale nie zalecamy uwzględniania woluminów przejściowych (takich jak dyski USB OTG).

  • Wymiana modułu MTP. Android 11 umieszcza stos MTP całkowicie poza granicami modułów i zapewnia jego działanie w porównaniu z publicznymi interfejsami API.

Testowanie

Aby sprawdzić działanie obiektu MediaProvider, przeprowadź te testy:

  • Aby sprawdzić działanie publicznych interfejsów API MediaStore, przeprowadź testy w pakiecie CtsProviderTestCases pakietu 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