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ą MediaStore publiczne interfejsów API. 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 identyfikacją i wyodrębnianiem danych z plików multimedialnych, a 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, dzięki czemu 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 na podstawie kombinacji nadrzędnego środowiska Debian Linux i Android .

  • 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 opiera się na zmiany wprowadzone w Androidzie 10, w tym 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, które umożliwiają zbiorczą modyfikację wielu elementów dla jednego użytkownika w tym createDeleteRequest(), createFavoriteRequest(), createTrashRequest() i createWriteRequest().

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

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

  • Ulepszenie do wyodrębniania metadanych z plików PNG i WebP w pliku ExifInterface kontenery.

  • Ulepszenia funkcji SystemUI w zakresie zapisywania metadanych DateTimeOriginal na ekranie zdjęcia.

Dodatkowo można teraz dostosowywać MediaProvider, dodając nowe formaty multimediów oznaczanie urządzeń pamięci do indeksowania, a nawet zastąpienie MTP stosów. Szczegółowe informacje znajdziesz w sekcji Dostosowywanie.

Granica modułu

Android 11 przenosi cały kod packages/providers/MediaProvider do nowej lokalizacji (z istotnym wyjątkiem) i zasady 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ści MediaProvider są związane z dostosowaniami (które Jeśli dostosowujesz MediaProvider, musisz się upewnić, że implementacja spełnia zależność związana z Twoimi dostosowaniami).

  • Gdy korzystasz z niestandardowych lub niestandardowych formatów plików multimedialnych (np. wygenerowane przez aplikację Aparat danego dostawcy), musisz zarejestrować każdą niestandardową za pomocą MimeUtils i modułu Media Extractor, aby włączyć indeksowanie 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, i wymienić stos MTP.

  • Niestandardowe formaty multimediów. W przypadku każdego nowego niestandardowego formatu multimediów musisz podać atrybut z unikalnego rozszerzenia pliku na typ MIME. Zdecydowanie zalecamy przestrzegać 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ć urządzenie metadanych formatów niestandardowych.

    • W przypadku plików image/* MediaProvider kontynuuje standaryzację klasy Exif w przypadku metadanych. Możesz przedłużyć: android.media.ExifInterface, aby pobrać i zwrócić dane Exif dla dowolnych niestandardowych formatów obrazów.

  • Flaga indeksowania urządzeń pamięci. MediaProvider indeksuje wszystkie zwrócone woluminy przez StorageManager.getStorageVolumes(), gdzie Pole StorageVolume.getMediaStoreVolumeName() nie ma wartości null. Możesz dostosować lista woluminów, które mają wpływ na to, co jest indeksowane, ale odradzamy w tym woluminy tymczasowe (np. dyski OTG USB).

  • Zastąpienie stosu MTP. Android 11 umieszcza MTP są całkowicie poza granicami modułu i zapewniają publicznych interfejsów API.

Testowanie

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

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