Od 27 marca 2025 r. zalecamy używanie android-latest-release
zamiast aosp-main
do kompilowania i wspołtworzenia AOSP. Więcej informacji znajdziesz w artykule o zmianach w AOSP.
Moduł MediaProvider
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
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 i image/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/*
i audio/*
(za pomocą funkcji MediaMetadataRetriever
) oraz plików image/*
(za pomocą funkcji ExifInterface
);
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 argument QUERY_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()
i createWriteRequest()
.
Nowe kolumny GENERATION_ADDED
i GENERATION_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 metadanych DateTimeOriginal
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
.
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/*
i audio/*
MediaProvider nadal korzysta z funkcji MediaMetadataRetriever
. 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 formatu Exif
. Możesz rozszerzyć android.media.ExifInterface
, aby wyodrębnić i zwrócić metadane Exif
dla dowolnych niestandardowych formatów obrazów.
Flaga indeksowania urządzeń pamięci masowej. MediaProvider indeksuje wszystkie woluminy zwracane przez StorageManager.getStorageVolumes()
, w których StorageVolume.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
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-07-27 UTC.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 2025-07-27 UTC."],[],[],null,["# MediaProvider module\n\nThe MediaProvider module optimizes indexed metadata (audio, video, and images\nfrom SD cards and USB devices) and makes that data available to apps through the\n[MediaStore public\nAPIs](https://developer.android.com/reference/android/provider/MediaStore).\nTo maintain user privacy, the MediaProvider module enforces the [scoped storage\nsecurity\nmodel](https://developer.android.com/training/data-storage/files/external-scoped)\nintroduced in Android 10, which includes redacting sensitive location metadata.\nThis module is updatable, enabling Android to respond faster to security issues\n(keeping sensitive user data protected) and add new media formats quicker\n(providing consistency to both users and developers).\n\nChanges in Android 10\n---------------------\n\nAndroid 10 introduced several improvements related to identifying and extracting\ndata from media files, specifically:\n\n- Determining the file content type using the first part of a file's MIME type.\n For example, the OS knows that both `image/png` and\n `image/x-newly-invented-format` are images, and can thus accurately describe\n relevant permissions to the end user.\n\n- Determining the MIME type using only the file extension (and without using\n [content sniffing](https://en.wikipedia.org/wiki/Content_sniffing)\n to avoid security issues).\n\n- Determining the MIME type of an arbitrary file using a combination of\n [upstream Debian Linux and Android\n mappings](https://android-review.googlesource.com/c/platform/libcore/+/735506).\n\n- Returning relevant data from `video/*` and `audio/*` files (via\n `MediaMetadataRetriever`) and `image/*` files (via `ExifInterface`).\n\nChanges in Android 11\n---------------------\n\nIn Android 11, the MediaProvider module builds on the\nchanges made in Android 10 with the following improvements:\n\n- Improvements to indexing. The MediaProvider module now indexes metadata by\n reconciling available metadata against MediaStore public APIs. Changes\n include:\n\n - New `is_favorite` column and `QUERY_ARG_MATCH_FAVORITE` argument to enable\n gallery-style apps to quickly filter media based on this column.\n\n - Indexing color space metadata.\n\n - New 'is_trashed' column and `QUERY_ARG_MATCH_TRASHED` argument to enable\n gallery-style apps to filter based on this column.\n\n - New APIs that enable bulk-modification of multiple items with a single user\n dialog prompt, including `createDeleteRequest()`, `createFavoriteRequest()`,\n `createTrashRequest()`, and `createWriteRequest()`.\n\n - New `GENERATION_ADDED` and `GENERATION_MODIFIED` columns for use in quickly\n and reliably detecting changes that have occurred since a previous\n synchronization point.\n\n - New `GROUP BY` public API for use with additional metadata columns not\n mentioned above.\n\n- Improvement to `ExifInterface` to extract metadata from PNG and WebP\n containers.\n\n- Improvements to `SystemUI` to write `DateTimeOriginal` metadata in screen\n captures.\n\nIn addition, you can now customize MediaProvider by adding new media formats,\nmarking which storage devices should be indexed, and even replacing the MTP\nstack. For details, see [Customization](#customization).\n\nModule boundary\n---------------\n\nAndroid 11 migrates all code in\n`packages/providers/MediaProvider` to a new location, with the notable exception\nof MTP-related logic. In addition,\n`frameworks/base/core/java/android/provider/MediaStore.java` is now *inside* the\nmodule boundary at `packages/providers/MediaProvider`.\n\nPackage format\n--------------\n\nThe MediaProvider module is in APK-in-APEX format.\n\nDependencies\n------------\n\nMediaProvider dependencies are related to [customizations](#customization) (that\nis, if you customize MediaProvider, you must ensure your implementation meets\nthe dependency associated with your customization).\n\n- When using custom or nonstandard media file formats (for example, a format\n generated by a vendor-specific Camera app), you must register each custom\n format with `MimeUtils` and the Media Extractor module to enable indexing by\n MediaProvider.\n\n- To ensure MediaProvider indexes a custom set of storage devices (such SD card\n slots and USB ports) used in a `StorageManagerService` implementation, set the\n `VolumeInfo.MOUNT_FLAG_INDEXABLE` flag.\n\n- When using a custom (non-AOSP) MTP implementation, ensure the implementation\n relies solely on public and system APIs to enable the implementation to\n interact with MediaStore.\n\nCustomization\n-------------\n\nYou can now add new media formats, influence which storage devices are indexed,\nand replace the MTP stack.\n\n- **Custom media formats.** For each new custom media format, you must provide a\n mapping from the unique file extension to a MIME type. We strongly encourage\n you to follow the [IANA registration\n process](https://www.iana.org/assignments/media-types/media-types.xhtml).\n\n - You can't redefine an extension or MIME type that's already defined in AOSP.\n\n - For `video/*` and `audio/*` files, MediaProvider continues consulting\n `MediaMetadataRetriever`. Use the Android 10 Media Extractors to return\n metadata for custom formats.\n\n - For `image/*` files, MediaProvider continues standardizing on `Exif` for\n metadata. You can extend `android.media.ExifInterface` to extract and return\n `Exif` metadata for any custom image formats.\n\n- **Storage devices indexing flag.** MediaProvider indexes all volumes returned\n by `StorageManager.getStorageVolumes()` where\n `StorageVolume.getMediaStoreVolumeName()` is non-null. You can customize the\n list of volumes returned to influence what is indexed, but we advise against\n including transient volumes (such as USB OTG drives).\n\n- **MTP stack replacement.** Android 11 places the MTP\n stack entirely outside the module boundary and ensures that it works against\n public APIs.\n\nTesting\n-------\n\nYou can verify the functionality of MediaProvider using the following tests:\n\n- To verify the functionality of MediaStore public APIs, use tests in the\n `CtsProviderTestCases` package of the Android Compatibility Test Suite (CTS).\n\n- To verify the functionality of MediaProvider internals, use tests in\n `MediaProviderTests`.\n\nTo run both sets of tests together, use the following `atest` command: \n\n atest --test-mapping packages/providers/MediaProvider"]]