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/png
hem 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 (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 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_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 filtreleme yapmasını sağlamak için yeni "is_trashed" sütunu ve
QUERY_ARG_MATCH_TRASHED
bağı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_ADDED
veGENERATION_MODIFIED
sütunları.Yukarıda belirtilmeyen ek meta veri sütunlarıyla kullanılmak üzere yeni
GROUP BY
genel API.
PNG ve WebP kapsayıcılarından meta verileri ayıklamak için
ExifInterface
iyileştirildi.Ekran görüntülerinde
DateTimeOriginal
meta verileri yazmak içinSystemUI
ile 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
MimeUtils
ve Media Extractor modülüyle kaydetmeniz gerekir.MediaProvider'ın bir
StorageManagerService
uygulaması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_INDEXABLE
iş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,MediaMetadataRetriever
ile 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 verilerdeExif
standardını kullanmaya devam eder.android.media.ExifInterface
işlevini, herhangi bir özel resim biçimi içinExif
meta 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)
CtsProviderTestCases
paketindeki testleri kullanın.MediaProvider'ın iç kısımlarının işlevselliğini doğrulamak için
MediaProviderTests
iç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