MediaProvider 모듈

MediaProvider 모듈은 색인이 생성된 메타데이터(SD 카드 및 USB 기기의 오디오, 동영상, 이미지)를 최적화하고 MediaStore Public API를 통해 앱에서 이 데이터를 사용할 수 있도록 합니다. 사용자 개인정보 보호를 유지하기 위해 MediaProvider 모듈은 Android 10에서 도입되어 민감한 위치 메타데이터 수정 기능이 포함된 범위 지정 저장소 보안 모델을 적용합니다. 이 모듈은 업데이트할 수 있으므로 Android가 보안 문제에 더 빠르게 대응하고(민감한 사용자 데이터를 안전하게 보호) 새로운 미디어 형식을 빠르게 추가할 수 있습니다(사용자와 개발자 모두에게 일관성 제공).

Android 10 변경사항

Android 10에는 미디어 파일의 데이터 식별 및 추출과 관련된 여러 개선사항이 도입되었습니다.

  • 파일 MIME 유형의 첫 번째 부분으로 파일 콘텐츠 유형을 확인합니다. 예를 들어 OS는 image/pngimage/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_ADDEDGENERATION_MODIFIED 열입니다.

    • 위에 언급하지 않은 추가 메타데이터 열과 함께 사용하는 새로운 GROUP BY 공개 API입니다.

  • PNG와 WebP 컨테이너에서 메타데이터를 추출하도록 ExifInterface가 개선되었습니다.

  • 화면 캡처에 DateTimeOriginal 메타데이터를 쓰도록 SystemUI가 개선되었습니다.

또한 새로운 미디어 형식을 추가하고 색인을 생성해야 하는 저장소 기기를 표시하며 MTP 스택도 교체하여 이제 MediaProvider를 맞춤설정할 수 있습니다. 자세한 내용은 맞춤설정을 참고하세요.

모듈 경계

Android 11은 packages/providers/MediaProvider의 모든 코드를 새 위치로 이전합니다. 단, MTP 관련 로직은 예외입니다. 또한, 이제 frameworks/base/core/java/android/provider/MediaStore.javapackages/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는 새로 마운트된 저장소 볼륨에 기본 폴더 Music/, Podcasts/, Ringtones/, Alarms/, Notifications/, Pictures/, Movies/, Download/, DCIM/, Documents/, Audiobooks/, Recordings/을 만듭니다. (Recordings/ 디렉터리는 Android 11 이하에서 사용할 수 없음) Android 12 이상에서 OEM은 MediaProvider가 기본 생성 중에 건너뛰어야 하는 폴더에 대소문자를 구분하지 않는 제외 목록을 제공할 수 있습니다. 이러한 폴더(예: Download/ 폴더)는 외부 로직에 의해 계속 생성될 수 있습니다.

제외 목록을 추가하려면 config_foldersToSkipInDefaultCreation 런타임 리소스 오버레이 (RRO)를 사용합니다. 다음은 Notifications/Ringtones/ 기본 폴더를 제외하는 방법의 예입니다.

<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
    <item>"Notifications"</item>
    <item>"Ringtones"</item>
</string-array>

테스트

다음 테스트를 사용하여 MediaProvider의 기능을 확인할 수 있습니다.

  • MediaStore Public API의 기능을 확인하려면 Android 호환성 테스트 모음(CTS)의 CtsProviderTestCases 패키지의 테스트를 사용합니다.

  • MediaProvider 내부 기능을 확인하려면 MediaProviderTests의 테스트를 사용하세요.

두 테스트 세트를 함께 실행하려면 다음 atest 명령어를 사용합니다.

atest --test-mapping packages/providers/MediaProvider