وحدة MediaProvider

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

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

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

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

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

  • تحديد نوع MIME لملف عشوائي باستخدام مجموعة من عمليات الربط بين Debian 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 في APEX.

التبعيات

تتعلّق تبعيات MediaProvider بالتخصيصات (أي إذا خصّصت MediaProvider، عليك التأكّد من أنّ عملية التنفيذ تستوفي التبعية المرتبطة بالتخصيص).

  • عند استخدام تنسيقات ملفات وسائط مخصّصة أو غير عادية (على سبيل المثال، تنسيق تم إنشاؤه بواسطة تطبيق "الكاميرا" خاص بمورّد معيّن)، يجب تسجيل كل تنسيق مخصّص باستخدام MimeUtils ووحدة Media Extractor لتفعيل الفهرسة بواسطة MediaProvider.

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

  • عند استخدام تنفيذ مخصّص (غير AOSP) لبروتوكول نقل الوسائط (MTP)، تأكَّد من أنّ التنفيذ يعتمد فقط على واجهات برمجة التطبيقات العامة والنظامية لتمكين التنفيذ من التفاعل مع 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 المجلدات التلقائية Music/ وPodcasts/ وRingtones/ وAlarms/ وNotifications/ وPictures/ وMovies/ وDownload/ وDCIM/ وDocuments/ وAudiobooks/ وRecordings/ (لا يتوفّر الدليل Recordings/ على الإصدار 11 من نظام التشغيل Android والإصدارات الأقدم) لوحدات تخزين تم تركيبها حديثًا. في الإصدار 12 من نظام التشغيل Android والإصدارات الأحدث، يمكن لمصنّعي المعدات الأصلية تقديم قائمة استبعاد غير حساسة لحالة الأحرف للمجلدات التي يجب أن يتخطّاها MediaProvider أثناء عملية الإنشاء التلقائي. قد يتم إنشاء هذه المجلدات، مثل المجلد Download/، باستخدام منطق خارجي.

لإضافة قائمة استبعاد، استخدِم config_foldersToSkipInDefaultCreation تراكب مورد وقت التشغيل (RRO). في ما يلي مثال على كيفية استبعاد المجلّدَين التلقائيَين Notifications/ وRingtones/:

<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
    <item>"Notifications"</item>
    <item>"Ringtones"</item>
</string-array>

الاختبار

يمكنك التحقّق من وظائف MediaProvider باستخدام الاختبارات التالية:

  • للتحقّق من وظائف واجهات برمجة التطبيقات العامة في MediaStore، استخدِم الاختبارات في حزمة CtsProviderTestCases ضمن "مجموعة أدوات اختبار التوافق" (CTS) لنظام التشغيل Android.

  • للتحقّق من وظائف MediaProvider الداخلية، استخدِم الاختبارات في MediaProviderTests.

لتشغيل المجموعتين من الاختبارات معًا، استخدِم الأمر atest التالي:

atest --test-mapping packages/providers/MediaProvider