Modul Penyedia Media

Modul MediaProvider mengoptimalkan metadata yang diindeks (audio, video, dan gambar dari kartu SD dan perangkat USB) dan membuat data tersebut tersedia untuk aplikasi melalui API publik MediaStore . Untuk menjaga privasi pengguna, modul MediaProvider menerapkan model keamanan penyimpanan terbatas yang diperkenalkan di Android 10, yang mencakup pengeditan metadata lokasi sensitif. Modul ini dapat diperbarui, memungkinkan Android untuk merespons masalah keamanan dengan lebih cepat (menjaga data sensitif pengguna tetap terlindungi) dan menambahkan format media baru lebih cepat (memberikan konsistensi bagi pengguna dan pengembang).

Perubahan di Android 10

Android 10 memperkenalkan beberapa peningkatan terkait dengan mengidentifikasi dan mengekstrak data dari file media, khususnya:

  • Menentukan tipe konten file menggunakan bagian pertama dari tipe MIME file. Misalnya, OS mengetahui bahwa image/png dan image/x-newly-invented-format adalah gambar, dan dengan demikian dapat secara akurat menjelaskan izin yang relevan kepada pengguna akhir.

  • Menentukan jenis MIME hanya menggunakan ekstensi file (dan tanpa menggunakan konten sniffing untuk menghindari masalah keamanan).

  • Menentukan jenis MIME dari file arbitrer menggunakan kombinasi pemetaan Debian Linux dan Android upstream .

  • Mengembalikan data yang relevan dari file video/* dan audio/* (melalui MediaMetadataRetriever ) dan file image/* (melalui ExifInterface ).

Perubahan di Android 11

Di Android 11, modul MediaProvider dibuat berdasarkan perubahan yang dibuat di Android 10 dengan penyempurnaan berikut:

  • Perbaikan pengindeksan. Modul MediaProvider sekarang mengindeks metadata dengan merekonsiliasi metadata yang tersedia dengan API publik MediaStore. Perubahan meliputi:

    • Kolom is_favorite baru dan argumen QUERY_ARG_MATCH_FAVORITE untuk memungkinkan aplikasi bergaya galeri memfilter media dengan cepat berdasarkan kolom ini.

    • Mengindeks metadata ruang warna.

    • Kolom 'is_trashed' baru dan argumen QUERY_ARG_MATCH_TRASHED untuk mengaktifkan aplikasi bergaya galeri untuk memfilter berdasarkan kolom ini.

    • API baru yang memungkinkan modifikasi massal beberapa item dengan satu permintaan dialog pengguna, termasuk createDeleteRequest() , createFavoriteRequest() , createTrashRequest() , dan createWriteRequest() .

    • Kolom GENERATION_ADDED dan GENERATION_MODIFIED baru untuk digunakan dalam mendeteksi perubahan yang telah terjadi sejak titik sinkronisasi sebelumnya dengan cepat dan andal.

    • API publik GROUP BY baru untuk digunakan dengan kolom metadata tambahan yang tidak disebutkan di atas.

  • Peningkatan ExifInterface untuk mengekstrak metadata dari wadah PNG dan WebP.

  • Perbaikan SystemUI untuk menulis metadata DateTimeOriginal dalam tangkapan layar.

Selain itu, Anda kini dapat menyesuaikan MediaProvider dengan menambahkan format media baru, menandai perangkat penyimpanan mana yang harus diindeks, dan bahkan mengganti tumpukan MTP. Untuk detailnya, lihat Penyesuaian .

Batas modul

Android 11 memigrasikan semua kode dalam packages/providers/MediaProvider ke lokasi baru, dengan pengecualian logika terkait MTP. Selain itu, frameworks/base/core/java/android/provider/MediaStore.java sekarang berada di dalam batas modul di packages/providers/MediaProvider .

Format paket

Modul MediaProvider dalam format APK-in-APEX.

Ketergantungan

Dependensi MediaProvider terkait dengan penyesuaian (yaitu, jika Anda menyesuaikan MediaProvider, Anda harus memastikan implementasi Anda memenuhi ketergantungan yang terkait dengan penyesuaian Anda).

  • Saat menggunakan format file media khusus atau tidak standar (misalnya, format yang dihasilkan oleh aplikasi Kamera khusus vendor), Anda harus mendaftarkan setiap format khusus dengan MimeUtils dan modul Media Extractor untuk mengaktifkan pengindeksan oleh MediaProvider.

  • Untuk memastikan MediaProvider mengindeks kumpulan perangkat penyimpanan khusus (slot kartu SD dan port USB) yang digunakan dalam implementasi StorageManagerService , setel tanda VolumeInfo.MOUNT_FLAG_INDEXABLE .

  • Saat menggunakan implementasi MTP kustom (non-AOSP), pastikan implementasi hanya mengandalkan API publik dan sistem untuk memungkinkan implementasi berinteraksi dengan MediaStore.

Kustomisasi

Sekarang Anda dapat menambahkan format media baru, memengaruhi perangkat penyimpanan mana yang diindeks, dan mengganti tumpukan MTP.

  • Format media khusus. Untuk setiap format media kustom baru, Anda harus menyediakan pemetaan dari ekstensi file unik ke tipe MIME. Kami sangat menganjurkan Anda untuk mengikuti proses pendaftaran IANA .

    • Anda tidak dapat mendefinisikan ulang ekstensi atau tipe MIME yang sudah ditentukan di AOSP.

    • Untuk file video/* dan audio/* , MediaProvider terus berkonsultasi MediaMetadataRetriever . Gunakan Android 10 Media Extractors untuk mengembalikan metadata untuk format khusus.

    • Untuk file image/* , MediaProvider melanjutkan standarisasi di Exif untuk metadata. Anda dapat memperluas android.media.ExifInterface untuk mengekstrak dan mengembalikan metadata Exif untuk format gambar khusus apa pun.

  • Bendera pengindeksan perangkat penyimpanan. MediaProvider mengindeks semua volume yang dikembalikan oleh StorageManager.getStorageVolumes() dengan StorageVolume.getMediaStoreVolumeName() bukan nol. Anda dapat menyesuaikan daftar volume yang dikembalikan untuk memengaruhi apa yang diindeks, tetapi kami menyarankan untuk tidak menyertakan volume sementara (seperti drive USB OTG).

  • Penggantian tumpukan MTP. Android 11 menempatkan tumpukan MTP sepenuhnya di luar batas modul dan memastikan bahwa itu bekerja melawan API publik.

Pengujian

Anda dapat memverifikasi fungsionalitas MediaProvider menggunakan tes berikut:

  • Untuk memverifikasi fungsionalitas API publik MediaStore, gunakan pengujian dalam paket CtsProviderTestCases dari Android Compatibility Test Suite (CTS).

  • Untuk memverifikasi fungsionalitas internal MediaProvider, gunakan pengujian di MediaProviderTests .

Untuk menjalankan kedua rangkaian pengujian bersama-sama, gunakan perintah atest berikut:

atest --test-mapping packages/providers/MediaProvider