MediaProvider modülü

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 de image/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/* ve audio/* dosyalarından (MediaMetadataRetriever aracılığıyla) ve image/* 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 ve QUERY_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() ve createWriteRequest() 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 ve GENERATION_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çin SystemUI 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çin VolumeInfo.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/* ve audio/* 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 verilerde Exif standardını kullanmaya devam eder. android.media.ExifInterface işlevini, herhangi bir özel resim biçimi için Exif 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. Burada StorageVolume.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