Moduł MediaProvider

Moduł MediaProvider optymalizuje zindeksowane metadane (audio, 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 stosowanie ograniczonego modelu zabezpieczeń miejsca na dane wprowadzonego na Androidzie 10, który obejmuje usuwanie poufnych metadanych lokalizacji. Moduł można aktualizować, co umożliwia Androidowi szybsze reagowanie na problemy z bezpieczeństwem (ochronę poufnych danych użytkowników) i szybsze dodawanie nowych formatów multimediów (zapewniając spójność zarówno użytkownikom, jak i deweloperom).

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 image/png i image/x-newly-invented-format są obrazami, więc może trafnie opisywać odpowiednie uprawnienia użytkownikowi.

  • 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/* plików (przy użyciu 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 teraz metadane przez uzgadnianie dostępnych metadanych 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 umożliwiają filtrowanie aplikacji w stylu galerii na podstawie tej kolumny.

    • Nowe interfejsy API, które umożliwiają zbiorczą modyfikację wielu elementów za pomocą prompta w oknie z jednym użytkownikiem, w tym createDeleteRequest(), createFavoriteRequest(), createTrashRequest() i createWriteRequest().

    • Nowe kolumny GENERATION_ADDED i GENERATION_MODIFIED umożliwiają szybkie i niezawodne wykrywanie zmian, które nastąpiły od ostatniego punktu synchronizacji.

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

  • Ulepszenie ExifInterface pozwalające na wyodrębnianie metadanych z kontenerów PNG i WebP.

  • Poprawki w SystemUI, które umożliwiają zapisywanie 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. Szczegółowe informacje 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 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 mieć pewność, że MediaProvider zindeksuje 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 korzystasz z niestandardowego (nieAOSP) implementacji MTP, upewnij się, że implementacja opiera się wyłącznie na publicznych i systemowych interfejsach API, aby umożliwić interakcję z MediaStore.

Personalizacja

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. Gorąco zachęcamy do przestrzegania procesu rejestracji IANA.

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

    • W przypadku plików video/* i audio/* MediaProvider kontynuuje konsultacje 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 w przypadku dowolnych niestandardowych formatów graficznych.

  • Flaga indeksowania urządzeń pamięci. MediaProvider indeksuje wszystkie woluminy zwrócone przez funkcję StorageManager.getStorageVolumes(), przy czym StorageVolume.getMediaStoreVolumeName() ma wartość inną niż null. Możesz dostosować listę zwracanych woluminów, aby wpłynąć 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łó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, użyj testów w pakiecie CtsProviderTestCases pakietu Android Compatibility Test Suite (CTS).

  • Aby sprawdzić działanie zasobów wewnętrznych 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