وحدة MediaProvider

تعمل وحدة MediaProvider على تحسين البيانات الوصفية المفهرَسة (الصوت والفيديو والصور من بطاقات SD وأجهزة USB) وإتاحة هذه البيانات للتطبيقات من خلال MediaStore public APIs. للحفاظ على خصوصية المستخدم، تفرض وحدة MediaProvider نموذج أمان مساحة التخزين النطاق الذي تم طرحه في Android 10، والذي يتضمّن إخفاء البيانات الوصفية الحساسة للمواقع الجغرافية. هذه الوحدة قابلة للتحديث، ما يتيح لنظام Android الاستجابة بشكل أسرع لمشاكل الأمان (الحفاظ على حماية بيانات المستخدمين الحساسة) وإضافة تنسيقات وسائط جديدة بشكل أسرع (ما يضمن الاتساق لكل من المستخدمين والمطوّرين).

التغييرات في Android 10

أدخل Android 10 عدّة تحسينات متعلّقة بتحديد البيانات واستخراجها من ملفات الوسائط، وبالأخص:

  • تحديد نوع محتوى الملف باستخدام الجزء الأول من نوع MIME للملف على سبيل المثال، يعرف نظام التشغيل أنّ كلاً من image/png وimage/x-newly-invented-format عبارة عن صور، وبالتالي يمكنه وصف الأذونات ذات الصلة بدقّة للمستخدم النهائي.

  • تحديد نوع MIME باستخدام امتداد الملف فقط (وبدون استخدام التقاط المحتوى لتجنُّب المشاكل المتعلّقة بالأمان)

  • تحديد نوع MIME لملف عشوائي باستخدام مجموعة من عمليات ربط Linux وAndroid الرئيسية.

  • عرض البيانات ذات الصلة من ملفات video/* وaudio/* (عبر MediaMetadataRetriever) وimage/* من الملفات (عبر ExifInterface).

التغييرات التي تم إجراؤها في Android 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 ووحدة "أداة استخراج الوسائط" لتفعيل الفهرسة من خلال MediaProvider.

  • لضمان فهرسة MediaProvider لمجموعة مخصّصة من أجهزة التخزين (مثل منافذ بطاقة SD ومنافذ USB) المستخدَمة في تنفيذ StorageManagerService، يجب ضبط العلامة VolumeInfo.MOUNT_FLAG_INDEXABLE.

  • عند استخدام تنفيذ بروتوكول نقل الوسائط (MTP) المخصّص (الذي لا يتوافق مع بروتوكول AOSP)، تأكَّد من أنّ التنفيذ يعتمد فقط على واجهات برمجة التطبيقات العامة وواجهات برمجة التطبيقات الخاصة بالنظام لإتاحة التفاعل مع MediaStore.

التخصيص

يمكنك الآن إضافة تنسيقات وسائط جديدة والتأثير في أجهزة التخزين التي تتم فهرستها واستبدال حزمة MTP.

  • تنسيقات الوسائط المخصّصة: بالنسبة إلى كل تنسيق وسائط مخصّصة جديدة، يجب توفير عملية ربط من امتداد الملف الفريد إلى نوع MIME. ننصحك بشدة باتّباع عملية التسجيل في هيئة أرقام الإنترنت المخصصة (IANA).

    • لا يمكنك إعادة تحديد إضافة أو نوع MIME سبق أن تم تحديده في بروتوكول AOSP.

    • بالنسبة إلى ملفات video/* وaudio/*، تواصل MediaProvider استشارة MediaMetadataRetriever. استخدِم أدوات استخراج الوسائط من Android 10 لعرض البيانات الوصفية للتنسيقات المخصَّصة.

    • بالنسبة إلى ملفات 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