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 iimage/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/*
iaudio/*
(za pomocąMediaMetadataRetriever
) orazimage/*
(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 argumentQUERY_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()
icreateWriteRequest()
.Nowe kolumny
GENERATION_ADDED
iGENERATION_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 metadanychDateTimeOriginal
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/*
iaudio/*
MediaProvider nadal korzysta z funkcjiMediaMetadataRetriever
. 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ę metadanychExif
. Możesz rozszerzyćandroid.media.ExifInterface
, aby wyodrębniać i zwracać metadaneExif
dla dowolnego niestandardowego formatu obrazu.
Flaga indeksowania urządzeń pamięci masowej. MediaProvider indeksuje wszystkie woluminy zwrócone przez funkcję
StorageManager.getStorageVolumes()
, przy czymStorageVolume.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