MediaProvider modülü

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 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 de image/x-newly-invented-format'in resim olduğunu bilir ve bu nedenle son kullanıcıya ilgili izinleri 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 kombinasyonu kullanılarak rastgele bir dosyanın MIME türünü belirleme.

  • video/* ve audio/* dosyalarından (MediaMetadataRetriever üzerinden) ve image/* dosyalarından (ExifInterface üzerinden) alakalı veriler döndürülüyor.

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 ve QUERY_ARG_MATCH_FAVORITE bağımsız değişkeni.

    • Renk alanı meta verileri dizine ekleniyor.

    • 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.

    • Tek bir kullanıcı iletişim kutusu istemiyle birden fazla öğenin toplu olarak değiştirilmesini sağlayan createDeleteRequest(), createFavoriteRequest(), createTrashRequest() ve createWriteRequest() 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 ve GENERATION_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ülerinde DateTimeOriginal meta verisi yazmak için SystemUI ü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 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 eklediğinden emin olmak için VolumeInfo.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 belirleyebilir 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ı kesinlikle öneririz.

    • AOSP'de tanımlanmış bir uzantıyı veya MIME türünü yeniden tanımlayamazsınız.

    • MediaProvider, video/* ve audio/* dosyaları için MediaMetadataRetriever danışmanlığına devam ediyor. Özel biçimler için meta verileri döndürmek amacıyla Android 10 Medya Ayıklayıcılarını kullanın.

    • image/* dosyaları için MediaProvider, meta verileri Exif ile standartlaştırmaya devam eder. Tüm özel resim biçimleri için Exif meta verilerini çıkarmak ve döndürmek için android.media.ExifInterface öğesini genişletebilirsiniz.

  • Depolama cihazlarını dizine ekleme işareti. MediaProvider, StorageVolume.getMediaStoreVolumeName() değerinin null olmadığı durumlarda StorageManager.getStorageVolumes() tarafından döndürülen tüm birimleri 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ı modül sınırının tamamen dışına taşır ve herkese açık API'lerde çalışmasını sağlar.

Test

MediaProvider'ın işlevselliğini 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 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