Modul MediaProvider

Modul MediaProvider mengoptimalkan metadata yang diindeks (audio, video, dan gambar dari kartu SD dan perangkat USB) dan membuat data tersebut tersedia untuk aplikasi melalui MediaStore publik Google Cloud API. Untuk menjaga privasi pengguna, modul MediaProvider menerapkan model keamanan penyimpanan terbatas yang diperkenalkan di Android 10, yang mencakup penyamaran metadata lokasi sensitif. Modul ini dapat diperbarui, sehingga Android dapat merespons masalah keamanan dengan lebih cepat (menjaga perlindungan data pengguna yang sensitif) dan menambahkan format media baru dengan lebih cepat (memberikan konsistensi bagi 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 tahu bahwa image/png dan image/x-newly-invented-format adalah gambar, sehingga dapat mendeskripsikan secara akurat izin akses yang relevan kepada pengguna akhir.

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

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

  • Menampilkan 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 dilakukan di Android 10 dengan peningkatan berikut:

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

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

    • Mengindeks metadata ruang warna.

    • 'is_trashed' baru kolom 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 perintah dialog pengguna, termasuk createDeleteRequest(), createFavoriteRequest(), createTrashRequest(), dan createWriteRequest().

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

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

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

  • Peningkatan pada SystemUI untuk menulis metadata DateTimeOriginal di layar yang dihasilkan.

Selain itu, kini Anda dapat menyesuaikan MediaProvider dengan menambahkan format media baru, menandai perangkat penyimpanan 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 penting logika terkait MTP. Selain itu, frameworks/base/core/java/android/provider/MediaStore.java kini di dalam batas modul di packages/providers/MediaProvider.

Format paket

Modul MediaProvider memiliki format APK-in-APEX.

Dependensi

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

  • Saat menggunakan format file media kustom atau nonstandar (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 kartu SD slot dan port USB) yang digunakan dalam implementasi StorageManagerService, setel atribut tanda VolumeInfo.MOUNT_FLAG_INDEXABLE.

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

Penyesuaian

Anda kini dapat menambahkan format media baru, memengaruhi perangkat penyimpanan yang diindeks, dan mengganti stack MTP.

  • Format media kustom. Untuk setiap format media kustom baru, Anda harus menyediakan pemetaan dari ekstensi file unik ke jenis MIME. Kami sangat menganjurkan Anda untuk mengikuti pendaftaran IANA {i>checkout<i}.

    • Anda tidak dapat menentukan ulang ekstensi atau jenis MIME yang sudah didefinisikan dalam AOSP.

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

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

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

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

Pengujian

Anda dapat memverifikasi fungsi MediaProvider menggunakan pengujian berikut:

  • Untuk memverifikasi fungsi API publik MediaStore, gunakan pengujian di CtsProviderTestCases dari 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