Medya Sağlayıcı Modülü

MediaProvider modülü, dizine alınmış meta verileri (SD kartlardan ve USB aygıtlarından ses, video ve görüntüler) optimize eder ve bu verileri MediaStore genel API'leri aracılığıyla uygulamalara sunar. Kullanıcı gizliliğini korumak için MediaProvider modülü, Android 10'da tanıtılan ve hassas konum meta verilerinin yeniden düzenlenmesini içeren kapsamlı depolama güvenlik modelini uygular. Bu modül güncellenebilir, Android'in güvenlik sorunlarına daha hızlı yanıt vermesini (hassas kullanıcı verilerini koruma altında tutma) ve yeni medya formatlarını daha hızlı eklemesini (hem kullanıcılar hem de geliştiriciler için tutarlılık sağlayarak) sağlar.

Android 10'daki değişiklikler

Android 10, özellikle medya dosyalarından verilerin tanımlanması ve çıkarılmasıyla 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 image/x-newly-invented-format format'ın görüntü 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ından kaçınmak için içerik koklamayı 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/* 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 kullanılabilir 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ızla filtrelemesini sağlamak için yeni is_favorite sütunu ve QUERY_ARG_MATCH_FAVORITE bağımsız değişkeni.

    • Renk uzayı meta verilerini indeksleme.

    • Galeri tarzı uygulamaların bu sütuna göre filtrelenmesini sağlamak için 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 istemiyle birden çok öğenin 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 algılamak için kullanım için 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 görüntülerinde DateTimeOriginal meta verileri yazmak için SystemUI iyileştirmeler.

Ayrıca, artık yeni medya biçimleri ekleyerek, hangi depolama aygıtları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, bkz. Özelleştirme .

Modül sınırı

Android 11, packages/providers/MediaProvider içindeki tüm kodu, MTP ile ilgili mantığın dikkate değer istisnası dışında yeni bir konuma taşır. Ek olarak, frameworks/base/core/java/android/provider/MediaStore.java şimdi package packages/providers/MediaProvider konumunda modül sınırının içindedir .

Paket formatı

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 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 bir özel formatı MimeUtils ve Media Extractor modülü ile kaydetmeniz gerekir.

  • MediaProvider'ın StorageManagerService uygulamasında kullanılan özel bir depolama aygıtları kümesini (örneğin SD kart yuvaları ve USB bağlantı noktaları) endekslediğinden emin olmak için VolumeInfo.MOUNT_FLAG_INDEXABLE bayrağını ayarlayın.

  • Özel (AOSP olmayan) bir MTP uygulaması kullanırken, uygulamanın MediaStore ile etkileşime girmesini sağlamak için uygulamanın yalnızca genel 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 formatları. Her yeni özel medya biçimi için, benzersiz dosya uzantısından bir MIME türüne bir eşleme sağlamalısınız. IANA kayıt sürecini takip etmenizi şiddetle tavsiye ederiz.

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

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

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

  • Depolama aygıtları indeksleme bayrağı. MediaProvider, StorageVolume.getMediaStoreVolumeName() öğesinin boş olmadığı StorageManager.getStorageVolumes( StorageManager.getStorageVolumes() tarafından döndürülen tüm birimleri dizine ekler. Dizine alınanları etkilemek için döndürülen birimlerin listesini özelleştirebilirsiniz, ancak geçici birimleri (USB OTG sürücüleri gibi) dahil etmemenizi öneririz.

  • MTP yığını değiştirme. Android 11, MTP yığınını tamamen modül sınırı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 öğelerinin 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