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 penyuntingan metadata lokasi sensitif. Modul ini dapat diperbarui, memungkinkan Android merespons masalah keamanan dengan lebih cepat (menjaga data sensitif pengguna tetap terlindungi) dan menambahkan format media baru dengan lebih cepat (memberikan konsistensi bagi pengguna dan pengembang).

Perubahan di Android 10

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

  • Menentukan tipe konten file menggunakan bagian pertama 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 tipe MIME hanya menggunakan ekstensi file (dan tanpa menggunakan sniffing konten untuk menghindari masalah keamanan).

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

  • 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 peningkatan berikut:

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

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

    • Mengindeks metadata ruang warna.

    • Kolom 'is_trashed' dan argumen QUERY_ARG_MATCH_TRASHED baru 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 dalam mendeteksi perubahan yang 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 pada ExifInterface untuk mengekstrak metadata dari kontainer PNG dan WebP.

  • Perbaikan pada SystemUI untuk menulis metadata DateTimeOriginal dalam tangkapan layar.

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

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 kini berada di dalam batas modul di packages/providers/MediaProvider .

Format paket

Modul MediaProvider dalam format APK-in-APEX.

Ketergantungan

Ketergantungan MediaProvider berkaitan 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 nonstandar (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 (seperti slot kartu SD dan port USB) yang digunakan dalam implementasi StorageManagerService , atur 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

Anda kini 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 dengan MediaMetadataRetriever . Gunakan Android 10 Media Extractors untuk mengembalikan metadata untuk format khusus.

    • Untuk file image/* , MediaProvider terus melakukan standarisasi pada 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, namun 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 tumpukan tersebut berfungsi pada API publik.

Pengujian

Anda dapat memverifikasi fungsionalitas MediaProvider menggunakan tes berikut:

  • Untuk memverifikasi fungsi 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 secara bersamaan, gunakan perintah atest berikut:

atest --test-mapping packages/providers/MediaProvider