تعمل وحدة MediaProvider على تحسين البيانات الوصفية المفهرسة (الصوت والفيديو والصور من بطاقات SD وأجهزة USB) وتجعل هذه البيانات متاحة للتطبيقات من خلال واجهات برمجة تطبيقات MediaStore العامة . للحفاظ على خصوصية المستخدم، تفرض وحدة MediaProvider نموذج أمان التخزين المحدد المقدم في Android 10، والذي يتضمن تنقيح البيانات التعريفية الحساسة للموقع. هذه الوحدة قابلة للتحديث، مما يمكّن Android من الاستجابة بشكل أسرع للمشكلات الأمنية (الحفاظ على حماية بيانات المستخدم الحساسة) وإضافة تنسيقات وسائط جديدة بشكل أسرع (توفير الاتساق لكل من المستخدمين والمطورين).
التغييرات في أندرويد 10
قدم Android 10 العديد من التحسينات المتعلقة بتحديد البيانات واستخراجها من ملفات الوسائط، وتحديدًا:
تحديد نوع محتوى الملف باستخدام الجزء الأول من نوع MIME الخاص بالملف. على سبيل المثال، يعرف نظام التشغيل أن كلاً من
image/png
وimage/x-newly-invented-format
عبارة عن صور، وبالتالي يمكنه وصف الأذونات ذات الصلة بدقة للمستخدم النهائي.تحديد نوع MIME باستخدام امتداد الملف فقط (وبدون استخدام استنشاق المحتوى لتجنب مشكلات الأمان).
تحديد نوع MIME لملف عشوائي باستخدام مجموعة من تعيينات Debian Linux وAndroid الأولية .
إرجاع البيانات ذات الصلة من ملفات
video/*
audio/*
(عبرMediaMetadataRetriever
) وملفاتimage/*
(عبرExifInterface
).
التغييرات في أندرويد 11
في Android 11، تعتمد وحدة MediaProvider على التغييرات التي تم إجراؤها في Android 10 مع التحسينات التالية:
تحسينات على الفهرسة. تقوم وحدة MediaProvider الآن بفهرسة البيانات التعريفية عن طريق التوفيق بين البيانات التعريفية المتاحة وواجهات برمجة تطبيقات MediaStore العامة. تشمل التغييرات ما يلي:
عمود
is_favorite
الجديد ووسيطةQUERY_ARG_MATCH_FAVORITE
لتمكين التطبيقات ذات نمط المعرض من تصفية الوسائط بسرعة بناءً على هذا العمود.فهرسة البيانات الوصفية لمساحة اللون.
عمود "is_trashed" الجديد ووسيطة
QUERY_ARG_MATCH_TRASHED
لتمكين التطبيقات ذات نمط المعرض من التصفية بناءً على هذا العمود.واجهات برمجة التطبيقات الجديدة التي تتيح التعديل المجمع لعناصر متعددة من خلال موجه حوار مستخدم واحد، بما في ذلك
createDeleteRequest()
وcreateFavoriteRequest()
وcreateTrashRequest()
وcreateWriteRequest()
.أعمدة
GENERATION_ADDED
وGENERATION_MODIFIED
جديدة للاستخدام في الكشف السريع والموثوق عن التغييرات التي حدثت منذ نقطة المزامنة السابقة.واجهة برمجة تطبيقات
GROUP BY
العامة الجديدة للاستخدام مع أعمدة بيانات تعريف إضافية غير مذكورة أعلاه.
تحسين
ExifInterface
لاستخراج البيانات التعريفية من حاويات PNG وWebP.تحسينات على
SystemUI
لكتابة البيانات التعريفيةDateTimeOriginal
في لقطات الشاشة.
بالإضافة إلى ذلك، يمكنك الآن تخصيص MediaProvider عن طريق إضافة تنسيقات وسائط جديدة، وتحديد أجهزة التخزين التي يجب فهرستها، وحتى استبدال مكدس MTP. للحصول على التفاصيل، راجع التخصيص .
حدود الوحدة النمطية
يقوم Android 11 بترحيل جميع التعليمات البرمجية الموجودة في packages/providers/MediaProvider
إلى موقع جديد، مع استثناء ملحوظ للمنطق المتعلق بـ MTP. بالإضافة إلى ذلك، أصبحت frameworks/base/core/java/android/provider/MediaStore.java
الآن داخل حدود الوحدة في packages/providers/MediaProvider
.
تنسيق الحزمة
وحدة MediaProvider بتنسيق APK-in-APEX.
التبعيات
ترتبط تبعيات MediaProvider بالتخصيصات (أي، إذا قمت بتخصيص MediaProvider، فيجب عليك التأكد من أن التنفيذ الخاص بك يلبي التبعية المرتبطة بالتخصيص الخاص بك).
عند استخدام تنسيقات ملفات وسائط مخصصة أو غير قياسية (على سبيل المثال، تنسيق تم إنشاؤه بواسطة تطبيق كاميرا خاص بالمورد)، يجب عليك تسجيل كل تنسيق مخصص باستخدام
MimeUtils
ووحدة Media Extractor لتمكين الفهرسة بواسطة MediaProvider.للتأكد من أن MediaProvider يقوم بفهرسة مجموعة مخصصة من أجهزة التخزين (مثل فتحات بطاقة SD ومنافذ USB) المستخدمة في تطبيق
StorageManagerService
، قم بتعيين علامةVolumeInfo.MOUNT_FLAG_INDEXABLE
.عند استخدام تطبيق MTP مخصص (غير AOSP)، تأكد من أن التنفيذ يعتمد فقط على واجهات برمجة التطبيقات العامة وواجهات برمجة التطبيقات الخاصة بالنظام لتمكين التنفيذ من التفاعل مع MediaStore.
التخصيص
يمكنك الآن إضافة تنسيقات وسائط جديدة، والتأثير على أجهزة التخزين التي تتم فهرستها، واستبدال مكدس MTP.
تنسيقات الوسائط المخصصة. لكل تنسيق وسائط مخصص جديد، يجب عليك توفير تعيين من ملحق الملف الفريد إلى نوع MIME. ونحن نشجعك بشدة على متابعة عملية التسجيل في IANA .
لا يمكنك إعادة تعريف ملحق أو نوع MIME تم تعريفه بالفعل في AOSP.
بالنسبة لملفات
video/*
audio/*
، يستمر MediaProvider في استشارةMediaMetadataRetriever
. استخدم Android 10 Media Extractors لإرجاع البيانات التعريفية للتنسيقات المخصصة.بالنسبة لملفات
image/*
، يستمر MediaProvider في توحيد معاييرExif
للبيانات التعريفية. يمكنك توسيعandroid.media.ExifInterface
لاستخراج بيانات تعريفExif
وإرجاعها لأي تنسيقات صور مخصصة.
علامة فهرسة أجهزة التخزين. يقوم MediaProvider بفهرسة كافة وحدات التخزين التي يتم إرجاعها بواسطة
StorageManager.getStorageVolumes()
حيث تكونStorageVolume.getMediaStoreVolumeName()
غير فارغة. يمكنك تخصيص قائمة وحدات التخزين التي تم إرجاعها للتأثير على ما تتم فهرسته، لكننا ننصح بعدم تضمين وحدات التخزين المؤقتة (مثل محركات أقراص USB OTG).استبدال مكدس MTP. يضع Android 11 مكدس MTP بالكامل خارج حدود الوحدة ويضمن أنه يعمل ضد واجهات برمجة التطبيقات العامة.
اختبارات
يمكنك التحقق من وظائف MediaProvider باستخدام الاختبارات التالية:
للتحقق من وظائف واجهات برمجة التطبيقات العامة لـ MediaStore، استخدم الاختبارات في حزمة
CtsProviderTestCases
الخاصة بمجموعة اختبار توافق Android (CTS).للتحقق من وظائف MediaProvider الداخلية، استخدم الاختبارات في
MediaProviderTests
.
لتشغيل مجموعتي الاختبارات معًا، استخدم الأمر atest
التالي:
atest --test-mapping packages/providers/MediaProvider