2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
MediaProvider 모듈
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
MediaProvider 모듈은 색인이 생성된 메타데이터(SD 카드 및 USB 기기의 오디오, 동영상, 이미지)를 최적화하고 MediaStore Public API를 통해 앱에서 이 데이터를 사용할 수 있도록 합니다.
사용자 개인정보 보호를 유지하기 위해 MediaProvider 모듈은 Android 10에서 도입되어 민감한 위치 메타데이터 수정 기능이 포함된 범위 지정 저장소 보안 모델을 적용합니다.
이 모듈은 업데이트할 수 있으므로 Android가 보안 문제에 더 빠르게 대응하고(민감한 사용자 데이터를 안전하게 보호) 새로운 미디어 형식을 빠르게 추가할 수 있습니다(사용자와 개발자 모두에게 일관성 제공).
Android 10 변경사항
Android 10에는 미디어 파일의 데이터 식별 및 추출과 관련된 여러 개선사항이 도입되었습니다.
파일 MIME 유형의 첫 번째 부분으로 파일 콘텐츠 유형을 확인합니다.
예를 들어 OS는 image/png
및 image/x-newly-invented-format
이 모두 이미지라는 것을 인식하므로 최종 사용자에게 관련 권한을 정확하게 설명할 수 있습니다.
보안 문제를 피하기 위해 콘텐츠 스니핑을 사용하지 않고 파일 확장자만 사용하여 MIME 유형을 확인합니다.
업스트림 Debian Linux 및 Android 매핑의 조합을 사용하여 임의 파일의 MIME 유형을 확인합니다.
video/*
및 audio/*
파일(MediaMetadataRetriever
를 통해)과 image/*
파일(ExifInterface
를 통해)에서 관련 데이터를 반환합니다.
Android 11 변경사항
Android 11에서는 MediaProvider 모듈이 Android 10의 변경사항에 기반하며 다음 개선사항을 포함합니다.
색인 생성이 개선되었습니다. 이제 MediaProvider 모듈이 MediaStore Public API에 사용 가능한 메타데이터를 조정하여 메타데이터의 색인을 생성합니다. 변경사항:
새로운 is_favorite
열과 QUERY_ARG_MATCH_FAVORITE
인수를 사용하여 갤러리 스타일 앱이 이 열에 기반하여 미디어를 빠르게 필터링할 수 있습니다.
색상 공간 메타데이터의 색인을 생성합니다.
새로운 'is_trashed' 열과 QUERY_ARG_MATCH_TRASHED
인수를 사용하여 갤러리 스타일 앱이 이 열에 기반하여 필터링할 수 있습니다.
createDeleteRequest()
, createFavoriteRequest()
, createTrashRequest()
, createWriteRequest()
를 포함하여 단일 사용자 대화상자 프롬프트로 여러 항목을 일괄 수정할 수 있는 새로운 API입니다.
이전 동기화 지점 이후 발생한 변경사항을 빠르고 안정적으로 감지하는 데 사용하는 새로운 GENERATION_ADDED
및 GENERATION_MODIFIED
열입니다.
위에 언급하지 않은 추가 메타데이터 열과 함께 사용하는 새로운 GROUP BY
공개 API입니다.
PNG와 WebP 컨테이너에서 메타데이터를 추출하도록 ExifInterface
가 개선되었습니다.
화면 캡처에 DateTimeOriginal
메타데이터를 쓰도록 SystemUI
가 개선되었습니다.
또한 새로운 미디어 형식을 추가하고 색인을 생성해야 하는 저장소 기기를 표시하며 MTP 스택도 교체하여 이제 MediaProvider를 맞춤설정할 수 있습니다. 자세한 내용은 맞춤설정을 참고하세요.
모듈 경계
Android 11은 packages/providers/MediaProvider
의 모든 코드를 새 위치로 이전합니다. 단, MTP 관련 로직은 예외입니다. 또한, 이제 frameworks/base/core/java/android/provider/MediaStore.java
가 packages/providers/MediaProvider
의 모듈 경계 내에 있습니다.
MediaProvider 모듈은 APK-in-APEX 형식입니다.
종속 항목
MediaProvider 종속 항목은 맞춤설정과 관련이 있습니다. 즉, MediaProvider를 맞춤설정하면 구현이 맞춤설정과 연결된 종속 항목을 충족하는지 확인해야 합니다.
맞춤 또는 비표준 미디어 파일 형식(예: 공급업체별 카메라 앱에서 생성된 형식)을 사용할 때 각 맞춤 형식을 MimeUtils
및 Media Extractor 모듈에 등록하여 MediaProvider가 색인을 생성할 수 있어야 합니다.
MediaProvider가 StorageManagerService
구현에서 사용되는 맞춤 저장소 기기 세트(예: SD 카드 슬롯 및 USB 포트)의 색인을 생성하도록 하려면 VolumeInfo.MOUNT_FLAG_INDEXABLE
플래그를 설정합니다.
맞춤(비 AOSP) MTP 구현을 사용할 때 구현이 공개 API와 시스템 API에만 의존하여 MediaStore와 상호작용할 수 있도록 해야 합니다.
맞춤설정
이제 새로운 미디어 형식을 추가하고 색인이 생성되는 저장소 기기에 영향을 미치며 MTP 스택을 교체할 수 있습니다.
맞춤 미디어 형식. 새로운 맞춤 미디어 형식마다 고유한 파일 확장자에서 MIME 유형으로의 매핑을 제공해야 합니다. IANA 등록 프로세스를 따르는 것이 좋습니다.
AOSP에서 이미 정의한 확장자나 MIME 유형을 다시 정의할 수는 없습니다.
video/*
및 audio/*
파일의 경우 MediaProvider는 MediaMetadataRetriever
를 계속 참고합니다. Android 10 Media Extractor를 사용하여 맞춤 형식의 메타데이터를 반환합니다.
image/*
파일의 경우 MediaProvider는 메타데이터의 Exif
에서 표준화를 계속 진행합니다. android.media.ExifInterface
를 확장하여 모든 맞춤 이미지 형식의 Exif
메타데이터를 추출하고 반환할 수 있습니다.
저장소 기기 색인 생성 플래그. MediaProvider는 StorageManager.getStorageVolumes()
에서 반환하는 모든 볼륨의 색인을 생성합니다. 여기서 StorageVolume.getMediaStoreVolumeName()
은 null이 아닙니다. 반환되는 볼륨 목록을 맞춤설정하여 색인이 생성되는 항목에 영향을 줄 수 있지만 일시적인 볼륨(예: USB OTG 드라이브)은 포함하지 않는 것이 좋습니다.
MTP 스택 교체. Android 11은 MTP 스택을 완전히 모듈 경계 외부에 배치하여 공개 API에서 작동하도록 합니다.
테스트
다음 테스트를 사용하여 MediaProvider의 기능을 확인할 수 있습니다.
두 테스트 세트를 함께 실행하려면 다음 atest
명령어를 사용합니다.
atest --test-mapping packages/providers/MediaProvider
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 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"]]