Moduł MediaProvider optymalizuje indeksowane metadane (audio, wideo i obrazy z kart SD i urządzeń USB) i udostępnia te dane aplikacjom za pomocą publicznych interfejsów API MediaStore. Aby chronić prywatność użytkowników, moduł MediaProvider wymusza model zabezpieczeń pamięci zakresowej wprowadzony w Androidzie 10, który obejmuje redagowanie 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 wprowadziliśmy kilka ulepszeń związanych z identyfikowaniem i wyodrębnianiem danych z plików multimedialnych, 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 iimage/x-newly-invented-format
to obrazy, i może w związku z tym dokładnie opisać odpowiednie uprawnienia użytkownikowi.Określanie typu MIME tylko na podstawie rozszerzenia pliku (bez używania wykrywania treści, aby uniknąć problemów z bezpieczeństwem).
Określanie typu MIME dowolnego pliku za pomocą kombinacji mapowań z Debiana Linux i Androida.
Zwracanie odpowiednich danych z plików
video/*
iaudio/*
(za pomocąMediaMetadataRetriever
) oraz plikówimage/*
(za pomocąExifInterface
).
Zmiany w Androidzie 11
W Androidzie 11 moduł MediaProvider wykorzystuje zmiany wprowadzone w Androidzie 10 i zawiera te ulepszenia:
Ulepszenia indeksowania. Moduł MediaProvider indeksuje teraz metadane, porównują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
, które umożliwiają aplikacjom w stylu galerii filtrowanie na podstawie tej kolumny.Nowe interfejsy API, które umożliwiają zbiorcze modyfikowanie wielu elementów za pomocą jednego okna dialogowego, w tym
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
icreateWriteRequest()
.Nowe kolumny
GENERATION_ADDED
iGENERATION_MODIFIED
, które umożliwiają szybkie i niezawodne wykrywanie zmian, jakie zaszły od poprzedniego punktu synchronizacji.Nowy
GROUP BY
publiczny interfejs API do używania z dodatkowymi kolumnami metadanych, które nie zostały wymienione powyżej.
Ulepszenie
ExifInterface
w celu wyodrębniania metadanych z kontenerów PNG i WebP.Ulepszenia
SystemUI
, które umożliwiają zapisywanieDateTimeOriginal
metadanych na zrzutach ekranu.
Możesz też dostosować MediaProvider, dodając nowe formaty multimediów, oznaczając, które urządzenia pamięci masowej mają być indeksowane, a nawet zastępując stos MTP. Więcej informacji znajdziesz w sekcji 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 punkt frameworks/base/core/java/android/provider/MediaStore.java
znajduje się teraz wewnątrz granicy modułu w punkcie packages/providers/MediaProvider
.
Format pakietu
Moduł MediaProvider jest w formacie APK w APEX.
Zależności
Zależności MediaProvider są związane z dostosowaniami (tzn. jeśli dostosujesz MediaProvider, musisz mieć pewność, że Twoja implementacja spełnia wymagania związane z tym dostosowaniem).
Jeśli używasz niestandardowych lub niestandardowych formatów plików multimedialnych (np. formatu wygenerowanego przez aplikację Aparat konkretnego dostawcy), musisz 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
.Jeśli używasz niestandardowej (nie pochodzącej z AOSP) implementacji MTP, upewnij się, że opiera się ona wyłącznie na publicznych i systemowych interfejsach API, 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, i zastępować stos MTP.
Niestandardowe formaty multimediów W przypadku każdego nowego niestandardowego formatu multimediów musisz podać mapowanie unikalnego rozszerzenia pliku na typ MIME. Gorąco zachęcamy do przejścia procesu rejestracji w 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 konsultuje się zMediaMetadataRetriever
. Użyj ekstraktorów multimediów z Androida 10, aby zwracać metadane w przypadku formatów niestandardowych.W przypadku plików
image/*
MediaProvider nadal będzie standardowo używaćExif
do metadanych. Możesz rozszerzyćandroid.media.ExifInterface
, aby wyodrębniać i zwracaćExif
metadane dla dowolnych formatów obrazów niestandardowych.
Flaga indeksowania urządzeń pamięci masowej. MediaProvider indeksuje wszystkie woluminy zwrócone przez
StorageManager.getStorageVolumes()
, gdzieStorageVolume.getMediaStoreVolumeName()
nie jest wartością null. Możesz dostosować listę zwracanych woluminów, aby wpływać na to, co jest indeksowane, ale odradzamy uwzględnianie woluminów tymczasowych (takich jak dyski USB OTG).Zastąpienie stosu MTP. Android 11 umieszcza stos MTP całkowicie poza granicami modułu i zapewnia, że działa on w oparciu o publiczne interfejsy API.
Testowanie
Funkcjonalność MediaProvider możesz sprawdzić za pomocą tych testów:
Aby sprawdzić działanie publicznych interfejsów API MediaStore, użyj testów w
CtsProviderTestCases
pakiecie 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