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 pośrednictwem publicznych interfejsów API MediaStore . Aby zachować prywatność użytkowników, moduł MediaProvider wymusza model zabezpieczeń pamięci masowej wprowadzony w systemie Android 10, który obejmuje redagowanie wrażliwych metadanych lokalizacji. Moduł ten można aktualizować, dzięki czemu system Android może szybciej reagować na problemy związane z bezpieczeństwem (chroniąc wrażliwe dane użytkownika) 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 usprawnień związanych z identyfikacją i wyodrębnianiem danych z plików multimedialnych, a konkretnie:

  • Określanie typu zawartości pliku przy użyciu pierwszej części typu MIME pliku. Na przykład system operacyjny wie, że zarówno image/png , jak i image/x-newly-invented-format są obrazami i dlatego może dokładnie opisać odpowiednie uprawnienia dla użytkownika końcowego.

  • Określanie typu MIME przy użyciu wyłącznie rozszerzenia pliku (i bez użycia wąchania zawartości , aby uniknąć problemów z bezpieczeństwem).

  • Określanie typu MIME dowolnego pliku przy użyciu kombinacji mapowań Debiana Linux i Androida .

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

Zmiany w Androidzie 11

W systemie Android 11 moduł MediaProvider opiera się na zmianach wprowadzonych w systemie Android 10 z następującymi ulepszeniami:

  • Ulepszenia indeksowania. Moduł MediaProvider indeksuje teraz 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ące aplikacjom w stylu galerii szybkie filtrowanie multimediów na podstawie tej kolumny.

    • Indeksowanie metadanych przestrzeni barw.

    • Nowa kolumna „jest_trashed” i argument QUERY_ARG_MATCH_TRASHED umożliwiające aplikacjom w stylu galerii filtrowanie na podstawie tej kolumny.

    • Nowe interfejsy API umożliwiające zbiorczą modyfikację wielu elementów za pomocą jednego okna dialogowego użytkownika, w tym createDeleteRequest() , createFavoriteRequest() , createTrashRequest() i createWriteRequest() .

    • Nowe kolumny GENERATION_ADDED i GENERATION_MODIFIED do wykorzystania w szybkim i niezawodnym wykrywaniu zmian, które nastąpiły od poprzedniego punktu synchronizacji.

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

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

  • Ulepszenia SystemUI umożliwiające zapisywanie metadanych DateTimeOriginal w zrzutach ekranu.

Ponadto możesz teraz dostosować MediaProvider, dodając nowe formaty multimediów, zaznaczając, które urządzenia pamięci masowej powinny być indeksowane, a nawet zastępując stos MTP. Aby uzyskać szczegółowe informacje, zobacz Dostosowywanie .

Granica modułu

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

Format pakietu

Moduł MediaProvider jest w formacie APK-in-APEX.

Zależności

Zależności MediaProvider są powiązane z dostosowaniami (oznacza to, że jeśli dostosujesz MediaProvider, musisz upewnić się, że implementacja spełnia zależności skojarzone z Twoim dostosowaniem).

  • W przypadku korzystania z niestandardowych lub niestandardowych formatów plików multimedialnych (na przykład formatu wygenerowanego przez aplikację aparatu konkretnego dostawcy) należy 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 .

  • W przypadku korzystania z niestandardowej (innej niż AOSP) implementacji MTP należy upewnić się, że implementacja opiera się wyłącznie na publicznych i systemowych interfejsach API, aby umożliwić interakcję implementacji z MediaStore.

Dostosowywanie

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

  • Niestandardowe formaty multimediów. Dla każdego nowego niestandardowego formatu multimediów należy zapewnić mapowanie z unikalnego rozszerzenia pliku na typ MIME. Gorąco zachęcamy do śledzenia procesu rejestracji w IANA .

    • Nie można ponownie zdefiniować rozszerzenia ani typu MIME, który jest już zdefiniowany w AOSP.

    • W przypadku plików video/* i audio/* firma MediaProvider kontynuuje konsultację MediaMetadataRetriever . Użyj ekstraktorów multimediów w systemie Android 10, aby zwrócić metadane dla niestandardowych formatów.

    • W przypadku plików image/* MediaProvider kontynuuje standaryzację metadanych w Exif . Możesz rozszerzyć android.media.ExifInterface , aby wyodrębnić i zwrócić metadane Exif dla dowolnych niestandardowych formatów obrazów.

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

  • Wymiana stosu MTP. Android 11 umieszcza stos MTP całkowicie poza granicami modułu i zapewnia, że ​​działa on z publicznymi interfejsami API.

Testowanie

Funkcjonalność MediaProvider możesz sprawdzić za pomocą następujących testów:

  • Aby zweryfikować funkcjonalność publicznych API MediaStore, użyj testów w pakiecie CtsProviderTestCases pakietu Android Compatibility Test Suite (CTS).

  • Aby zweryfikować funkcjonalność elementów wewnętrznych MediaProvider, użyj testów w MediaProviderTests .

Aby uruchomić oba zestawy testów jednocześnie, użyj następującego polecenia atest :

atest --test-mapping packages/providers/MediaProvider