MediaProvider modülü, dizine eklenen meta verileri (SD kartlardan ve USB cihazlardan alınan ses, video ve resimler) optimize eder ve bu verileri MediaStore herkese açık API'leri aracılığıyla uygulamalara sunar. MediaProvider modülü, kullanıcı gizliliğini korumak için Android 10'da kullanıma sunulan ve hassas konum meta verilerinin çıkartılmasını içeren kapsamlı depolama alanı güvenlik modelini uygular. Güncelleme yapılabilen bu modül, Android'in güvenlik sorunlarına daha hızlı yanıt vermesini (hassas kullanıcı verilerini koruma) ve yeni medya biçimlerini daha hızlı eklemesini (hem kullanıcılara hem de geliştiricilere tutarlılık sağlar) sağlar.
Android 10'daki değişiklikler
Android 10, medya dosyalarındaki verileri tanımlama ve ayıklamayla ilgili olarak çeşitli iyileştirmeler getirdi. Özellikle:
Dosyanın MIME türünün ilk bölümünü kullanarak dosya içeriği türünü belirleme. Örneğin, işletim sistemi hem
image/png
hem deimage/x-newly-invented-format
'in resim olduğunu bilir ve bu nedenle ilgili izinleri son kullanıcıya doğru bir şekilde açıklayabilir.MIME türünü yalnızca dosya uzantısını kullanarak belirleme (ve güvenlik sorunlarını önlemek için içerik koku alma özelliğini kullanmadan).
Yukarı akış Debian Linux ve Android eşlemelerinin bir kombinasyonunu kullanarak rastgele bir dosyanın MIME türünü belirleme.
video/*
veaudio/*
dosyalarından (MediaMetadataRetriever
aracılığıyla) veimage/*
dosyalarından (ExifInterface
aracılığıyla) alakalı verileri döndürme.
Android 11'deki değişiklikler
Android 11'de MediaProvider modülü, Android 10'da yapılan değişiklikleri temel alarak aşağıdaki iyileştirmeleri içerir:
Dizine eklemeyle ilgili iyileştirmeler. MediaProvider modülü artık mevcut meta verileri MediaStore'un herkese açık API'leriyle eşleştirerek dizine ekler. Değişiklikler şunlardır:
Galeri tarzı uygulamaların medyayı bu sütuna göre hızlıca filtrelemesini sağlayan yeni
is_favorite
sütunu veQUERY_ARG_MATCH_FAVORITE
bağımsız değişkeni.Renk alanı meta verilerini dizine ekleme.
Galeri tarzı uygulamaların bu sütuna göre filtrelenmesini sağlayan yeni "is_trashed" sütunu ve
QUERY_ARG_MATCH_TRASHED
bağımsız değişkeni.createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
vecreateWriteRequest()
dahil olmak üzere tek bir kullanıcı iletişim istemi ile birden fazla öğenin toplu olarak değiştirilmesini sağlayan yeni API'ler.Önceki bir senkronizasyon noktasından bu yana gerçekleşen değişiklikleri hızlı ve güvenilir bir şekilde algılamak için kullanılacak yeni
GENERATION_ADDED
veGENERATION_MODIFIED
sütunları.Yukarıda bahsedilmeyen ek meta veri sütunlarıyla kullanılmak üzere yeni
GROUP BY
herkese açık API.
PNG ve WebP kapsayıcılarından meta verileri ayıklamak için
ExifInterface
'te iyileştirme yapıldı.Ekran görüntülerine
DateTimeOriginal
meta verileri yazmak içinSystemUI
'te iyileştirmeler yapıldı.
Ayrıca artık yeni medya biçimleri ekleyerek, hangi depolama cihazlarının dizine ekleneceğini işaretleyerek ve hatta MTP yığınını değiştirerek MediaProvider'ı özelleştirebilirsiniz. Ayrıntılar için Özelleştirme bölümüne bakın.
Modül sınırı
Android 11, MTP ile ilgili mantık hariç olmak üzere packages/providers/MediaProvider
içindeki tüm kodu yeni bir konuma taşır. Ayrıca frameworks/base/core/java/android/provider/MediaStore.java
, packages/providers/MediaProvider
'deki modül sınırının içinde yer alır.
Paket biçimi
MediaProvider modülü, APEX içinde APK biçimindedir.
Bağımlılıklar
MediaProvider bağımlılıkları özelleştirmelerle ilgilidir (yani MediaProvider'ı özelleştirirseniz uygulamanızın, özelleştirmenizle ilişkili bağımlılığı karşıladığından emin olmanız gerekir).
Özel veya standart olmayan medya dosyası biçimleri (ör. tedarikçiye özgü bir kamera uygulaması tarafından oluşturulan bir biçim) kullanırken MediaProvider tarafından dizine eklemeyi etkinleştirmek için her özel biçimi
MimeUtils
ve Media Extractor modülüne kaydetmeniz gerekir.MediaProvider'ın,
StorageManagerService
uygulamasında kullanılan özel bir depolama cihazı grubunu (ör. SD kart yuvaları ve USB bağlantı noktaları) dizine eklemesini sağlamak içinVolumeInfo.MOUNT_FLAG_INDEXABLE
işaretini ayarlayın.Özel (AOSP olmayan) bir MTP uygulaması kullanırken uygulamanın MediaStore ile etkileşime geçmesini sağlamak için uygulamanın yalnızca herkese açık ve sistem API'lerini kullandığından emin olun.
Özelleştirme
Artık yeni medya biçimleri ekleyebilir, hangi depolama cihazlarının dizine ekleneceğini etkileyebilir ve MTP yığınını değiştirebilirsiniz.
Özel medya biçimleri. Her yeni özel medya biçimi için benzersiz dosya uzantısından MIME türüne bir eşleme sağlamanız gerekir. IANA kayıt sürecini uygulamanızı önemle tavsiye ederiz.
AOSP'de tanımlanmış bir uzantıyı veya MIME türünü yeniden tanımlayamazsınız.
MediaProvider,
video/*
veaudio/*
dosyaları içinMediaMetadataRetriever
ile danışmaya devam eder. Özel biçimler için meta verileri döndürmek üzere Android 10 Medya Ayıcılar'ı kullanın.image/*
dosyaları için MediaProvider, meta verileriExif
ile standartlaştırmaya devam eder.android.media.ExifInterface
işlevini genişleterek tüm özel resim biçimleri içinExif
meta verilerini ayıklayıp döndürebilirsiniz.
Depolama cihazı dizine ekleme işareti. MediaProvider,
StorageVolume.getMediaStoreVolumeName()
değerinin null olmadığı durumlardaStorageManager.getStorageVolumes()
tarafından döndürülen tüm hacimleri dizine ekler. Dizine eklenen öğeleri etkilemek için döndürülen birimlerin listesini özelleştirebilirsiniz ancak geçici birimleri (USB OTG sürücüler gibi) dahil etmemenizi öneririz.MTP yığınını değiştirme Android 11, MTP yığınını tamamen modül sınırının dışına yerleştirir ve herkese açık API'lerle çalışmasını sağlar.
Test
MediaProvider'ın işlevini aşağıdaki testleri kullanarak doğrulayabilirsiniz:
MediaStore'un herkese açık API'lerinin işlevini doğrulamak için Android Compatibility Test Suite (CTS)
CtsProviderTestCases
paketindeki testleri kullanın.MediaProvider'ın dahili işlevlerini doğrulamak için
MediaProviderTests
'teki testleri kullanın.
Her iki test grubunu da birlikte çalıştırmak için aşağıdaki atest
komutunu kullanın:
atest --test-mapping packages/providers/MediaProvider