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의 기능을 확인할 수 있습니다.

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

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

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

atest --test-mapping packages/providers/MediaProvider