Modul MediaProvider

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

Perubahan di Android 10

Android 10 memperkenalkan beberapa peningkatan terkait identifikasi dan ekstraksi data dari file media, khususnya:

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

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

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

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

Perubahan di Android 11

Di Android 11, modul MediaProvider didasarkan pada perubahan yang dilakukan di Android 10 dengan peningkatan berikut:

  • Peningkatan pada pengindeksan. Modul MediaProvider kini mengindeks metadata dengan mencocokkan metadata yang tersedia dengan MediaStore API publik. Perubahan mencakup:

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

    • Pengindeksan metadata ruang warna.

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

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

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

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

  • Peningkatan pada ExifInterface untuk mengekstrak metadata dari container PNG dan WebP.

  • Peningkatan pada SystemUI untuk menulis metadata DateTimeOriginal dalam screenshot.

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

Batas modul

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

Format paket

Modul MediaProvider berada dalam format APK-in-APEX.

Dependensi

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

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

  • Untuk memastikan MediaProvider mengindeks kumpulan perangkat penyimpanan kustom (seperti slot kartu SD dan port USB) yang digunakan dalam implementasi StorageManagerService, tetapkan flag 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.

Penyesuaian

Anda dapat menambahkan format media baru, memengaruhi perangkat penyimpanan mana yang diindeks, mengganti stack MTP, dan mengecualikan pembuatan folder default.

  • Format media kustom. Untuk setiap format media kustom baru, Anda harus menyediakan pemetaan dari ekstensi file unik ke jenis MIME. Sebaiknya ikuti proses pendaftaran IANA ini.

    • Anda tidak dapat menentukan ulang ekstensi atau jenis MIME yang sudah ditentukan di AOSP.

    • Untuk file video/* dan audio/*, MediaProvider terus berkonsultasi dengan MediaMetadataRetriever. Gunakan Media Extractor Android 10 untuk menampilkan metadata untuk format kustom.

    • Untuk file image/*, MediaProvider terus menstandarkan Exif untuk metadata. Anda dapat memperluas android.media.ExifInterface untuk mengekstrak dan menampilkan Exif metadata untuk format gambar kustom apa pun.

  • Flag pengindeksan perangkat penyimpanan. MediaProvider mengindeks semua volume yang ditampilkan oleh StorageManager.getStorageVolumes() dengan StorageVolume.getMediaStoreVolumeName() yang tidak null. Anda dapat menyesuaikan daftar volume yang ditampilkan untuk memengaruhi apa yang diindeks, tetapi sebaiknya jangan menyertakan volume sementara (seperti drive USB OTG).

  • Penggantian stack MTP. Android 11 menempatkan stack MTP sepenuhnya di luar batas modul dan memastikan stack tersebut berfungsi dengan API publik.

  • Daftar pengecualian folder default. MediaProvider membuat folder default Music/, Podcasts/, Ringtones/, Alarms/, Notifications/, Pictures/, Movies/, Download/, DCIM/, Documents/, Audiobooks/, dan Recordings/ (direktori Recordings/ tidak tersedia di Android 11 dan yang lebih rendah) untuk volume penyimpanan yang baru dipasang. Di Android 12 dan yang lebih tinggi, produsen peralatan asli (OEM) dapat menyediakan daftar pengecualian yang tidak peka huruf besar/kecil untuk folder yang harus dilewati MediaProvider selama pembuatan default. Folder ini, misalnya folder Download/, mungkin masih dibuat oleh logika di luar.

Untuk menambahkan daftar pengecualian, gunakan config_foldersToSkipInDefaultCreation overlay resource runtime (RRO). Berikut adalah contoh cara mengecualikan folder default Notifications/ dan Ringtones/:

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

Pengujian

Anda dapat memverifikasi fungsi MediaProvider menggunakan pengujian berikut:

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

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

Untuk menjalankan kedua kumpulan pengujian secara bersamaan, gunakan perintah atest berikut:

atest --test-mapping packages/providers/MediaProvider