MediaProvider modülü

MediaProvider modülü, indekslenmiş meta verileri (SD kartlardan ve USB aygıtlarından gelen ses, video ve görüntüler) optimize eder ve bu verileri MediaStore genel API'leri aracılığıyla uygulamaların kullanımına sunar. Kullanıcı gizliliğini korumak için MediaProvider modülü, Android 10'da sunulan ve hassas konum meta verilerinin çıkarılmasını da içeren kapsamlı depolama güvenlik modelini uygular. Bu modül güncellenebilir olup, Android'in güvenlik sorunlarına daha hızlı yanıt vermesini (hassas kullanıcı verilerini koruma altında tutmasını) ve yeni medya formatlarını daha hızlı eklemesini (hem kullanıcılara hem de geliştiricilere tutarlılık sağlamasını) sağlar.

Android 10'daki değişiklikler

Android 10, özellikle medya dosyalarından veri tanımlama ve çıkarmayla ilgili çeşitli iyileştirmeler sundu:

  • Bir 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 de image/x-newly-invented-format görsel olduğunu bilir ve böylece ilgili izinleri son kullanıcıya doğru bir şekilde tanımlayabilir.

  • Yalnızca dosya uzantısını kullanarak (ve güvenlik sorunlarını önlemek için içerik koklamayı kullanmadan) MIME türünü belirleme.

  • Yukarı akışlı Debian Linux ve Android eşlemelerinin bir kombinasyonunu kullanarak rastgele bir dosyanın MIME türünü belirleme.

  • video/* ve audio/* dosyalarından ( MediaMetadataRetriever aracılığıyla) ve image/* dosyalarından ( ExifInterface aracılığıyla) ilgili verileri döndürme.

Android 11'deki değişiklikler

Android 11'de MediaProvider modülü, aşağıdaki iyileştirmelerle Android 10'da yapılan değişiklikleri temel alır:

  • İndekslemede iyileştirmeler. MediaProvider modülü artık mevcut meta verileri MediaStore genel API'leriyle uzlaştırarak meta verileri dizine ekliyor. Değişiklikler şunları içerir:

    • Galeri tarzı uygulamaların medyayı bu sütuna göre hızlı bir şekilde filtrelemesini sağlayan yeni is_favorite sütunu ve QUERY_ARG_MATCH_FAVORITE bağımsız değişkeni.

    • Renk alanı meta verilerinin indekslenmesi.

    • Galeri tarzı uygulamaların bu sütuna göre filtreleme yapmasını sağlayan yeni 'is_trashed' sütunu ve QUERY_ARG_MATCH_TRASHED bağımsız değişkeni.

    • createDeleteRequest() , createFavoriteRequest() , createTrashRequest() ve createWriteRequest() dahil olmak üzere tek bir kullanıcı iletişim kutusu istemiyle birden çok öğenin toplu olarak değiştirilmesine olanak tanıyan yeni API'ler.

    • Önceki bir senkronizasyon noktasından bu yana meydana gelen değişikliklerin hızlı ve güvenilir bir şekilde tespit edilmesinde kullanılmak üzere yeni GENERATION_ADDED ve GENERATION_MODIFIED sütunları.

    • Yukarıda belirtilmeyen ek meta veri sütunlarıyla kullanım için yeni GROUP BY genel API'si.

  • PNG ve WebP kapsayıcılarından meta verileri çıkarmak için ExifInterface iyileştirme.

  • Ekran yakalamalarında DateTimeOriginal meta verilerini yazmaya yönelik SystemUI iyileştirmeleri.

Ayrıca artık yeni medya formatları ekleyerek, hangi depolama cihazlarının indekslenmesi gerektiğini işaretleyerek ve hatta MTP yığınını değiştirerek MediaProvider'ı özelleştirebilirsiniz. Ayrıntılar için bkz. Özelleştirme .

Modül sınırı

Android 11, MTP ile ilgili mantık dışında, packages/providers/MediaProvider tüm kodları yeni bir konuma taşıyor. Ayrıca, frameworks/base/core/java/android/provider/MediaStore.java artık packages/providers/MediaProvider adresindeki modül sınırının içindedir .

Paket formatı

MediaProvider modülü APK-in-APEX formatındadır.

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 olmalısınız).

  • Özel veya standart olmayan medya dosyası formatlarını kullanırken (örneğin, satıcıya özel bir Kamera uygulaması tarafından oluşturulan bir format), MediaProvider tarafından indekslemeyi etkinleştirmek için her özel formatı MimeUtils ve Media Extractor modülüne kaydetmeniz gerekir.

  • MediaProvider'ın, StorageManagerService uygulamasında kullanılan özel bir depolama aygıtları kümesini (SD kart yuvaları ve USB bağlantı noktaları gibi) dizine eklemesini sağlamak için VolumeInfo.MOUNT_FLAG_INDEXABLE bayrağını ayarlayın.

  • Özel (AOSP olmayan) bir MTP uygulaması kullanırken, uygulamanın MediaStore ile etkileşime girebilmesini sağlamak için uygulamanın yalnızca genel ve sistem API'lerine dayandığından emin olun.

Özelleştirme

Artık yeni medya formatları ekleyebilir, hangi depolama cihazlarının indeksleneceğini etkileyebilir ve MTP yığınını değiştirebilirsiniz.

  • Özel medya formatları. 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 takip etmenizi önemle tavsiye ederiz.

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

    • MediaProvider, video/* ve audio/* dosyaları için MediaMetadataRetriever danışmaya devam ediyor. Özel formatlara ilişkin meta verileri döndürmek için Android 10 Media Extractor'ı kullanın.

    • MediaProvider, image/* dosyalarında meta veriler için Exif standartlaştırmaya devam ediyor. Herhangi bir özel görüntü formatı için Exif meta verilerini ayıklamak ve döndürmek üzere android.media.ExifInterface genişletebilirsiniz.

  • Depolama aygıtları indeksleme bayrağı. MediaProvider, StorageManager.getStorageVolumes() tarafından döndürülen tüm birimleri indeksler; burada StorageVolume.getMediaStoreVolumeName() null değildir. Neyin indekslendiğini etkilemek için döndürülen birimlerin listesini özelleştirebilirsiniz ancak geçici birimlerin (USB OTG sürücüleri gibi) dahil edilmesini tavsiye etmiyoruz.

  • MTP yığınının değiştirilmesi. Android 11, MTP yığınını tamamen modül sınırlarının dışına yerleştirir ve genel API'lere karşı çalışmasını sağlar.

Test yapmak

Aşağıdaki testleri kullanarak MediaProvider'ın işlevselliğini doğrulayabilirsiniz:

  • MediaStore genel API'lerinin işlevselliğini doğrulamak için Android Uyumluluk Test Paketi'nin (CTS) CtsProviderTestCases paketindeki testleri kullanın.

  • MediaProvider dahili bileşenlerinin işlevselliğini doğrulamak için MediaProviderTests içindeki testleri kullanın.

Her iki test kümesini birlikte çalıştırmak için aşağıdaki atest komutunu kullanın:

atest --test-mapping packages/providers/MediaProvider