MediaProvider modülü, dizine eklenen meta verileri (SD kartlardan ve USB cihazlardan 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 sunulan kapsamlı depolama güvenlik modelini uygular. Bu model, hassas konum meta verilerini çıkartmayı da kapsar. Bu modül güncellenebilir. Böylece Android, güvenlik sorunlarına daha hızlı yanıt verebilir (hassas kullanıcı verilerini koruyabilir) ve yeni medya biçimlerini daha hızlı ekleyebilir (hem kullanıcılara hem de geliştiricilere tutarlılık sağlar).
Android 10'daki değişiklikler
Android 10, medya dosyalarındaki verileri tanımlama ve çıkarmayla ilgili çeşitli iyileştirmeler sundu. Örneğin:
Dosya içeriği türünü, dosyanın MIME türünün ilk bölümünü kullanarak belirleme. Örneğin, işletim sistemi hem
image/png
hem deimage/x-newly-invented-format
bilgisinin resim olduğunu bildiği için ilgili izinleri son kullanıcıya doğru bir şekilde açıklayabilir.MIME türünü yalnızca dosya uzantısını kullanarak (ve güvenlik sorunlarını önlemek için içerik algılama kullanmadan) belirleme.
Yukarı akış Debian Linux ve Android eşlemelerinin kombinasyonu kullanılarak rastgele bir dosyanın MIME türünü belirleme.
video/*
veaudio/*
dosyalarından (MediaMetadataRetriever
üzerinden) veimage/*
dosyalarından (ExifInterface
üzerinden) alakalı veriler döndürülüyor.
Android 11'deki değişiklikler
Android 11'de MediaProvider modülü, aşağıdaki iyileştirmelerle birlikte Android 10'da yapılan değişikliklerin üzerine inşa edilmiştir:
Dizine eklemeyle ilgili iyileştirmeler. MediaProvider modülü artık kullanılabilir meta verileri MediaStore herkese açık API'leriyle uzlaştırarak meta verileri dizine ekler. Değişiklikler şunlardır:
Galeri stili uygulamaların, medyayı bu sütuna göre hızlı bir şekilde filtrelemesini sağlamak için yeni
is_favorite
sütunu veQUERY_ARG_MATCH_FAVORITE
bağımsız değişkeni.Renk alanı meta verileri dizine ekleniyor.
Galeri stili uygulamaların bu sütuna göre filtrelemesini sağlamak için yeni "is_trashed" sütunu ve
QUERY_ARG_MATCH_TRASHED
bağımsız değişkeni.Tek bir kullanıcı iletişim kutusu istemiyle birden fazla öğenin toplu olarak değiştirilmesini sağlayan
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
vecreateWriteRequest()
gibi yeni API'ler.Önceki bir senkronizasyon noktasından bu yana gerçekleşen değişikliklerin hızlı ve güvenilir bir şekilde algılanmasında kullanılacak yeni
GENERATION_ADDED
veGENERATION_MODIFIED
sütunları.Yukarıda belirtilmeyen ek meta veri sütunlarıyla kullanım için yeni
GROUP BY
herkese açık API'si.
PNG ve WebP kapsayıcılarından meta veri ayıklamak için
ExifInterface
iyileştirmesi.Ekran görüntülerinde
DateTimeOriginal
meta verisi yazmak içinSystemUI
ürününde yapılan iyileştirmeler.
Buna ek olarak, artık yeni medya biçimleri ekleyerek, dizine eklenmesi gereken depolama cihazlarını 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 istisnası dışında packages/providers/MediaProvider
içindeki tüm kodları yeni bir konuma taşır. Ayrıca frameworks/base/core/java/android/provider/MediaStore.java
, şu anda packages/providers/MediaProvider
bölgesindeki modül sınırının içindedir.
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ştiriyorsanız uygulamanızın özelleştirmenizle ilişkili bağımlılığı karşıladığından emin olmanız gerekir).
Özel veya standart olmayan medya dosyası biçimlerini (örneğin, satıcıya özel bir Kamera uygulaması tarafından oluşturulan biçim) kullanırken, MediaProvider tarafından dizine eklemeyi etkinleştirmek için her bir özel biçimi
MimeUtils
ve Medya Ayıklayıcı 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 eklediğinden emin olmak 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 uygulamanın yalnızca herkese açık API'lere ve sistem API'lerine dayandığı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 bir MIME türüne eşleme sağlamanız gerekir. IANA kayıt sürecini uygulamanızı önemle tavsiye ederiz.
AOSP'de önceden tanımlanmış bir uzantıyı veya MIME türünü yeniden tanımlayamazsınız.
MediaProvider,
video/*
veaudio/*
dosyaları içinMediaMetadataRetriever
danışmanlığına devam etmektedir. Özel biçimlere ait meta verileri döndürmek için Android 10 Medya Ayıklayıcılarını kullanın.MediaProvider,
image/*
dosyaları için meta veriler içinExif
üzerinde standartlaştırmaya devam etmektedir. Tüm özel resim biçimleri içinExif
meta verilerini çıkarmak ve döndürmek içinandroid.media.ExifInterface
öğesini genişletebilirsiniz.
Depolama cihazlarını dizine ekleme işareti. MediaProvider,
StorageVolume.getMediaStoreVolumeName()
değerinin null olmadığı durumlardaStorageManager.getStorageVolumes()
tarafından döndürülen tüm birimleri dizine ekler. Dizine eklenecekleri etkilemek için döndürülen birimlerin listesini özelleştirebilirsiniz ancak geçici birimlerin (ör. USB OTG sürücüleri) dahil edilmesini önermeyiz.MTP yığını değişimi. Android 11, MTP yığınını modül sınırının tamamen dışına yerleştirir ve herkese açık API'lerde çalışmasını sağlar.
Test etme
MediaProvider'ın işlevselliğini aşağıdaki testleri kullanarak doğrulayabilirsiniz:
MediaStore herkese açık API'lerinin işlevlerini doğrulamak için Android Compatibility Test Suite'in (CTS)
CtsProviderTestCases
paketindeki testleri kullanın.MediaProvider dahililerinin işlevselliğini doğrulamak için
MediaProviderTests
içindeki testleri kullanın.
Her iki test grubunu birlikte çalıştırmak için aşağıdaki atest
komutunu kullanın:
atest --test-mapping packages/providers/MediaProvider