وحدة MediaProvider

تعمل وحدة 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