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