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 zachować prywatność użytkowników, moduł MediaProvider wymusza stosowanie limitu miejsca na dane zabezpieczenia model wprowadzone w Androidzie 10, które obejmują usuwanie poufnych metadanych lokalizacji. Moduł można aktualizować, dzięki czemu Android szybciej reaguje na problemy z bezpieczeństwem. (zachowanie ochrony 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 identyfikowaniem i wyodrębnianiem danych z plików multimedialnych, w tym:

  • 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 są obrazami i dzięki temu mogą dokładnie opisywać przyznanych użytkownikowi odpowiednich uprawnień.

  • Określanie typu MIME tylko na podstawie rozszerzenia pliku (bez użycia przechwytywanie treści w celu uniknięcia problemów z bezpieczeństwem).

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

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

Zmiany w Androidzie 11

W Androidzie 11 moduł MediaProvider korzysta z zmian wprowadzonych w Androidzie 10 i zawiera te ulepszenia:

  • Ulepszenia indeksowania. Moduł MediaProvider indeksuje teraz metadane według uzgadnianie dostępnych metadanych z publicznymi interfejsami API MediaStore. Zmiany uwzględnij:

    • Nowa kolumna is_favorite i QUERY_ARG_MATCH_FAVORITE argument do włączenia aplikacje typu galeria, by szybko filtrować multimedia na podstawie tej kolumny.

    • indeksowanie metadanych przestrzeni kolorów.

    • Nowy element „is_trashed” kolumna i QUERY_ARG_MATCH_TRASHED argument do włączenia aplikacje w stylu galerii, które ma być przefiltrowane na podstawie tej kolumny.

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

    • Nowe kolumny GENERATION_ADDED i GENERATION_MODIFIED do szybkiego użytku i skutecznie wykrywać zmiany, które zaszły od czasu poprzedniego i punkt synchronizacji.

    • Nowy publiczny interfejs API GROUP BY do użycia z dodatkowymi kolumnami metadanych nie wspomniane powyżej.

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

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

Dodatkowo możesz teraz dostosować MediaProvider, dodając nowe formaty multimediów, oznaczając urządzenia pamięci masowej, które mają zostać zindeksowane, a nawet zastępując pakiet 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. Ponadto: frameworks/base/core/java/android/provider/MediaStore.java znajduje się teraz wewnątrz granicę modułu w punkcie packages/providers/MediaProvider.

Format pakietu

Moduł MediaProvider ma format APK-in-APEX.

Zależności

Zależność MediaProvider jest związana z modyfikacjami (czyli jeśli zmodyfikujesz MediaProvider, musisz zadbać o to, aby jego implementacja spełniała wymagania związane z tą modyfikacją).

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

  • Aby zapewnić indeksowanie przez MediaProvider niestandardowego zestawu urządzeń pamięci (takich jak karta SD) i porty USB) używanych w implementacji StorageManagerService, ustaw VolumeInfo.MOUNT_FLAG_INDEXABLE.

  • Jeśli korzystasz z niestandardowego (nie AOSP) implementacji MTP, upewnij się, że opiera się wyłącznie na publicznych i systemowych interfejsach API, aby umożliwiać implementację wchodzić w 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, oraz zastępować pakiet MTP.

  • Niestandardowe formaty multimediów. W przypadku każdego nowego formatu multimediów niestandardowego musisz podać mapowanie unikalnego rozszerzenia pliku na typ MIME. Zdecydowanie zalecamy przestrzegać rejestracji IANA .

    • Nie możesz zmienić definicji 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ć urządzenie metadanych formatów niestandardowych.

    • W przypadku plików image/* MediaProvider nadal standardyzuje metadane do formatu 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 zwrócone woluminy przez StorageManager.getStorageVolumes(), gdzie Pole StorageVolume.getMediaStoreVolumeName() nie ma wartości 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).

  • Zastąpienie stosu MTP. W Androidzie 11 moduł MTP jest całkowicie umieszczony poza granicami modułu i działa w ramach publicznych interfejsów API.

Testowanie

Funkcję MediaProvider możesz sprawdzić za pomocą tych testów:

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

  • 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