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 o ograniczonym zakresie 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 dane wrażliwe 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 tym:
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-formatto obrazy, i dlatego może dokładnie opisać odpowiednie uprawnienia użytkownikowi.Określanie typu MIME tylko na podstawie rozszerzenia pliku (bez używania wykrywania typu 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_favoritei 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_trashedi argumentQUERY_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 użytkownika, w tym
createDeleteRequest(),createFavoriteRequest(),createTrashRequest()icreateWriteRequest().Nowe kolumny
GENERATION_ADDEDiGENERATION_MODIFIED, które umożliwiają szybkie i niezawodne wykrywanie zmian, jakie zaszły od poprzedniego punktu synchronizacji.Nowy
GROUP BYpubliczny interfejs API do używania z dodatkowymi kolumnami metadanych, które nie zostały wymienione powyżej.
Ulepszenie
ExifInterface, które umożliwia wyodrębnianie metadanych z kontenerów PNG i WebP.Ulepszenia
SystemUI, które umożliwiają zapisywanie metadanychDateTimeOriginalna zrzutach ekranu.
Możesz też 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 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 zadbać o to, aby Twoja implementacja spełniała 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
MimeUtilsi 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 (niepochodzącej z AOSP) implementacji MTP, upewnij się, że opiera się ona wyłącznie na publicznych interfejsach API i interfejsach API systemu, aby umożliwić jej interakcję z MediaStore.
Dostosowywanie
Możesz dodawać nowe formaty multimediów, wpływać na to, które urządzenia pamięci masowej są indeksowane, zastępować stos MTP i wykluczać tworzenie domyślnych folderów.
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 konsultujeMediaMetadataRetriever. 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ćExifdo metadanych. Możesz rozszerzyćandroid.media.ExifInterface, aby wyodrębniać i zwracaćExifmetadane 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 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.
Domyślna lista wykluczeń folderów. MediaProvider tworzy domyślne foldery:
Music/,Podcasts/,Ringtones/,Alarms/,Notifications/,Pictures/,Movies/,Download/,DCIM/,Documents/,Audiobooks/iRecordings/(katalogRecordings/nie jest dostępny w Androidzie 11 i starszych wersjach) dla nowo zamontowanych woluminów pamięci. Na Androidzie 12 i nowszym producenci oryginalnego sprzętu (OEM) mogą udostępniać listę wykluczeń bez rozróżniania wielkości liter w przypadku folderów, które MediaProvider powinien pomijać podczas domyślnego tworzenia. Te foldery, np. folderDownload/, mogą być nadal tworzone przez logikę zewnętrzną.
Aby dodać listę wykluczeń, użyj config_foldersToSkipInDefaultCreation
nakładki zasobu środowiska wykonawczego (RRO). Oto przykład wykluczania folderów domyślnych Notifications/ i Ringtones/:
<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
<item>"Notifications"</item>
<item>"Ringtones"</item>
</string-array>
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
CtsProviderTestCasespakiecie 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