Moduł MediaProvider optymalizuje zindeksowane metadane (dźwięk, filmy 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 ograniczonego przechowywania danych wprowadzony w Androidzie 10, który obejmuje pomijanie poufnych metadanych 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 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 jego typu MIME. 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ć użytkownikowi odpowiednie uprawnienia.Określanie typu MIME tylko na podstawie rozszerzenia pliku (bez korzystania z skanowania treści, aby uniknąć 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/*
iaudio/*
(za pomocą funkcjiMediaMetadataRetriever
) oraz plikówimage/*
(za pomocą funkcjiExifInterface
);
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, uzgadniając dostępne metadane z publicznymi interfejsami API MediaStore. Zmiany obejmują:
Nowa kolumna
is_favorite
i argumentQUERY_ARG_MATCH_FAVORITE
, które 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
, aby umożliwić aplikacjom w stylu galerii filtrowanie 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()
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.Ulepszenia
SystemUI
, które umożliwiają zapisywanie metadanychDateTimeOriginal
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. Dodatkowo frameworks/base/core/java/android/provider/MediaStore.java
jest 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ść MediaProvider jest związana z dostosowywaniem (czyli jeśli dostosowywujesz MediaProvider, musisz zadbać o to, aby implementacja spełniała wymagania związane z tą personalizacją).
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 masowej (takich jak gniazda kart SD i porty USB) używanych w implementacji
StorageManagerService
, ustaw flagęVolumeInfo.MOUNT_FLAG_INDEXABLE
.Jeśli używasz niestandardowej implementacji MTP (nie AOSP), sprawdź, czy opiera się ona wyłącznie na interfejsach API publicznych i systemowych, aby umożliwić jej 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 przestrzeganie procedury rejestracji IANA.
Nie możesz 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 narzędzi do wyodrębniania multimediów w Androidzie 10, aby zwrócić metadane dla formatów niestandardowych.W przypadku plików
image/*
MediaProvider nadal standardyzuje metadane do formatuExif
. Możesz rozszerzyćandroid.media.ExifInterface
, aby wyodrębnić i zwrócić metadaneExif
dla dowolnych niestandardowych formatów obrazów.
Flaga indeksowania urządzeń pamięci masowej. MediaProvider indeksuje wszystkie woluminy zwracane przez
StorageManager.getStorageVolumes()
, w którychStorageVolume.getMediaStoreVolumeName()
ma wartość inną niż null. Możesz dostosować listę zwróconych woluminów, aby wpływać na to, co ma być zindeksowane, ale nie zalecamy uwzględniania woluminów tymczasowych (takich jak dyski USB OTG).Wymiana modułu MTP. Android 11 umieszcza pakiet MTP całkowicie poza granicami modułu i zapewnia, że działa on w stosunku do 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