MediaProvider modülü, dizine eklenen meta verileri (SD kartlardaki ve USB cihazlardaki ses, video ve resimler) optimize eder ve bu verileri MediaStore herkese açık API'leri aracılığıyla uygulamaların kullanımına sunar. MediaProvider modülü, kullanıcı gizliliğini korumak için Android 10'da kullanıma sunulan kapsamlı depolama güvenlik modelini zorunlu kılar. Bu model, hassas konum meta verilerinin düzenlenmesini içerir. Bu modül güncellenebilir olduğundan Android, güvenlik sorunlarına daha hızlı yanıt verebilir (hassas kullanıcı verilerini koruyarak) ve yeni medya biçimlerini daha hızlı ekleyebilir (hem kullanıcılara hem de geliştiricilere tutarlılık sağlayarak).
Android 10'daki değişiklikler
Android 10, medya dosyalarından veri tanımlama ve ayıklama ile ilgili çeşitli iyileştirmeler sunar. Bunlardan bazıları şunlardır:
Dosyanın MIME türünün ilk bölümünü kullanarak dosya içerik türünü belirleme. Örneğin, işletim sistemi hem
image/pnghem deimage/x-newly-invented-formatöğesinin resim olduğunu bilir ve bu nedenle son kullanıcıya ilgili izinleri doğru bir şekilde açıklayabilir.Yalnızca dosya uzantısını kullanarak (ve güvenlik sorunlarını önlemek için içerik koklama kullanmadan) MIME türünü belirleme.
Yukarı akış Debian Linux ve Android eşlemelerinin bir kombinasyonunu kullanarak rastgele bir dosyanın MIME türünü belirleme.
video/*veaudio/*dosyalarından (MediaMetadataRetrieveraracılığıyla) veimage/*dosyalarından (ExifInterfacearacı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 alır ve aşağıdaki iyileştirmeleri içerir:
Dizine ekleme ile ilgili iyileştirmeler. MediaProvider modülü artık mevcut meta verileri MediaStore herkese açık API'leriyle karşılaştırarak meta verileri dizine ekliyor. Değişiklikler şunları içerir:
Galeri tarzı uygulamaların medyayı bu sütuna göre hızlıca filtrelemesini sağlamak için yeni
is_favoritesütunu veQUERY_ARG_MATCH_FAVORITEbağımsız değişkeni.Renk alanı meta verilerini dizine ekleme
Galeri tarzı uygulamaların bu sütuna göre filtreleme yapmasını sağlamak için yeni "is_trashed" sütunu ve
QUERY_ARG_MATCH_TRASHEDbağımsız değişkeni.createDeleteRequest(),createFavoriteRequest(),createTrashRequest()vecreateWriteRequest()dahil olmak üzere birden fazla öğenin tek bir kullanıcı iletişim kutusu istemiyle toplu olarak değiştirilmesini sağlayan yeni API'ler.Önceki bir senkronizasyon noktasından bu yana meydana gelen değişiklikleri hızlı ve güvenilir bir şekilde tespit etmek için kullanılabilecek yeni
GENERATION_ADDEDveGENERATION_MODIFIEDsütunları.Yukarıda belirtilmeyen ek meta veri sütunlarıyla kullanılmak üzere yeni
GROUP BYgenel API.
PNG ve WebP kapsayıcılarından meta verileri ayıklamak için
ExifInterfaceiyileştirildi.Ekran görüntülerinde
DateTimeOriginalmeta verileri yazmak içinSystemUIile ilgili iyileştirmeler.
Ayrıca, yeni medya biçimleri ekleyerek, hangi depolama cihazlarının dizine eklenmesi gerektiğ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ünü inceleyin.
Modül sınırı
Android 11, MTP ile ilgili mantık hariç olmak üzere packages/providers/MediaProvider içindeki tüm kodları yeni bir konuma taşır. Ayrıca, frameworks/base/core/java/android/provider/MediaStore.java artık packages/providers/MediaProvider konumundaki modül sınırının içinde yer alıyor.
Paket biçimi
MediaProvider modülü, APK-in-APEX 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 (örneğin, satıcıya özel bir Kamera uygulaması tarafından oluşturulan bir biçim) kullanırken MediaProvider tarafından dizine eklenmesini sağlamak için her özel biçimi
MimeUtilsve Media Extractor modülüyle kaydetmeniz gerekir.MediaProvider'ın bir
StorageManagerServiceuygulamasında kullanılan özel bir depolama cihazı grubunu (SD kart yuvaları ve USB bağlantı noktaları gibi) dizine eklemesini sağlamak içinVolumeInfo.MOUNT_FLAG_INDEXABLEişaretini ayarlayın.Özel (AOSP olmayan) bir MTP uygulaması kullanırken uygulamanın, MediaStore ile etkileşim kurabilmesi için 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 zaten tanımlanmış bir uzantıyı veya MIME türünü yeniden tanımlayamazsınız.
video/*veaudio/*dosyaları için MediaProvider,MediaMetadataRetrieverile iletişime geçmeye devam eder. Özel biçimler için meta verileri döndürmek üzere Android 10 Media Extractors'ı kullanın.MediaProvider,
image/*dosyaları için meta verilerdeExifstandardını kullanmaya devam eder.android.media.ExifInterfaceişlevini, herhangi bir özel resim biçimi içinExifmeta verilerini ayıklayıp döndürecek şekilde genişletebilirsiniz.
Depolama cihazları dizine ekleme işareti. MediaProvider,
StorageManager.getStorageVolumes()tarafından döndürülen tüm birimleri indeksler. BuradaStorageVolume.getMediaStoreVolumeName()boş değildir. Dizine eklenecek öğeleri etkilemek için döndürülen birimlerin listesini özelleştirebilirsiniz ancak geçici birimleri (ör. USB OTG sürücüleri) dahil etmemenizi öneririz.MTP yığını değişimi. Android 11, MTP yığınını tamamen modül sınırının dışına yerleştirir ve herkese açık API'lere karşı çalışmasını sağlar.
Test
Aşağıdaki testleri kullanarak MediaProvider'ın işlevselliğini doğrulayabilirsiniz:
MediaStore herkese açık API'lerinin işlevselliğini doğrulamak için Android Compatibility Test Suite (CTS)
CtsProviderTestCasespaketindeki testleri kullanın.MediaProvider'ın iç kısımlarının işlevselliğini doğrulamak için
MediaProviderTestsiçindeki 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