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 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 de image/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/* 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ü, 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 ve QUERY_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() 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 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ç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 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ç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 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/* ve audio/* dosyaları için MediaMetadataRetriever 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çin Exif üzerinde standartlaştırmaya devam etmektedir. 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 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