وحدة 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 سبق تعريفهما في مشروع Android المفتوح المصدر (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/، بواسطة منطق خارجي.

لإضافة قائمة استبعاد، استخدِم تراكب مورد وقت التشغيل (RRO) الخاص بـ config_foldersToSkipInDefaultCreation. في ما يلي مثال على كيفية استبعاد المجلّدَين التلقائيَين 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