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 iimage/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/*
iaudio/*
(poprzezMediaMetadataRetriever
) oraz plikówimage/*
(poprzezExifInterface
).
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 argumentQUERY_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()
icreateWriteRequest()
.Nowe kolumny
GENERATION_ADDED
iGENERATION_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 metadanychDateTimeOriginal
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/*
iaudio/*
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 wExif
. 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 zwrócone przez
StorageManager.getStorageVolumes()
, gdzieStorageVolume.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