اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release
بدلاً من aosp-main
لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
وحدة 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-in-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
لتوحيد metadata. يمكنك توسيع نطاق android.media.ExifInterface
لاستخراج بيانات Exif
الوصفية وإعادتها لأيّ تنسيقات صور مخصّصة.
علامة فهرسة أجهزة التخزين فهرس MediaProvider جميع المجلدات التي يتم إرجاعها
بواسطة StorageManager.getStorageVolumes()
حيث
StorageVolume.getMediaStoreVolumeName()
غير فارغة. يمكنك تخصيص
قائمة الأقراص التي يتم عرضها للتأثير في ما يتم فهرسته، ولكننا ننصح بعدم
تضمين الأقراص المؤقتة (مثل محركات أقراص USB OTG).
استبدال حِزمة MTP يضع نظام التشغيل Android 11 حِزمة MTP
بالكامل خارج حدود الوحدة ويضمن أن تعمل مع
واجهات برمجة التطبيقات العامة.
الاختبار
يمكنك التحقّق من وظيفة MediaProvider باستخدام الاختبارات التالية:
للتحقّق من وظيفة واجهات برمجة التطبيقات العامة في MediaStore، استخدِم الاختبارات في حزمة
CtsProviderTestCases
من مجموعة أدوات اختبار التوافق (CTS) لنظام التشغيل Android.
للتحقّق من وظيفة الوظائف الداخلية في MediaProvider، استخدِم الاختبارات في
MediaProviderTests
.
لإجراء كلتا مجموعتَي الاختبارات معًا، استخدِم الأمر atest
التالي:
atest --test-mapping packages/providers/MediaProvider
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# MediaProvider module\n\nThe MediaProvider module optimizes indexed metadata (audio, video, and images\nfrom SD cards and USB devices) and makes that data available to apps through the\n[MediaStore public\nAPIs](https://developer.android.com/reference/android/provider/MediaStore).\nTo maintain user privacy, the MediaProvider module enforces the [scoped storage\nsecurity\nmodel](https://developer.android.com/training/data-storage/files/external-scoped)\nintroduced in Android 10, which includes redacting sensitive location metadata.\nThis module is updatable, enabling Android to respond faster to security issues\n(keeping sensitive user data protected) and add new media formats quicker\n(providing consistency to both users and developers).\n\nChanges in Android 10\n---------------------\n\nAndroid 10 introduced several improvements related to identifying and extracting\ndata from media files, specifically:\n\n- Determining the file content type using the first part of a file's MIME type.\n For example, the OS knows that both `image/png` and\n `image/x-newly-invented-format` are images, and can thus accurately describe\n relevant permissions to the end user.\n\n- Determining the MIME type using only the file extension (and without using\n [content sniffing](https://en.wikipedia.org/wiki/Content_sniffing)\n to avoid security issues).\n\n- Determining the MIME type of an arbitrary file using a combination of\n [upstream Debian Linux and Android\n mappings](https://android-review.googlesource.com/c/platform/libcore/+/735506).\n\n- Returning relevant data from `video/*` and `audio/*` files (via\n `MediaMetadataRetriever`) and `image/*` files (via `ExifInterface`).\n\nChanges in Android 11\n---------------------\n\nIn Android 11, the MediaProvider module builds on the\nchanges made in Android 10 with the following improvements:\n\n- Improvements to indexing. The MediaProvider module now indexes metadata by\n reconciling available metadata against MediaStore public APIs. Changes\n include:\n\n - New `is_favorite` column and `QUERY_ARG_MATCH_FAVORITE` argument to enable\n gallery-style apps to quickly filter media based on this column.\n\n - Indexing color space metadata.\n\n - New 'is_trashed' column and `QUERY_ARG_MATCH_TRASHED` argument to enable\n gallery-style apps to filter based on this column.\n\n - New APIs that enable bulk-modification of multiple items with a single user\n dialog prompt, including `createDeleteRequest()`, `createFavoriteRequest()`,\n `createTrashRequest()`, and `createWriteRequest()`.\n\n - New `GENERATION_ADDED` and `GENERATION_MODIFIED` columns for use in quickly\n and reliably detecting changes that have occurred since a previous\n synchronization point.\n\n - New `GROUP BY` public API for use with additional metadata columns not\n mentioned above.\n\n- Improvement to `ExifInterface` to extract metadata from PNG and WebP\n containers.\n\n- Improvements to `SystemUI` to write `DateTimeOriginal` metadata in screen\n captures.\n\nIn addition, you can now customize MediaProvider by adding new media formats,\nmarking which storage devices should be indexed, and even replacing the MTP\nstack. For details, see [Customization](#customization).\n\nModule boundary\n---------------\n\nAndroid 11 migrates all code in\n`packages/providers/MediaProvider` to a new location, with the notable exception\nof MTP-related logic. In addition,\n`frameworks/base/core/java/android/provider/MediaStore.java` is now *inside* the\nmodule boundary at `packages/providers/MediaProvider`.\n\nPackage format\n--------------\n\nThe MediaProvider module is in APK-in-APEX format.\n\nDependencies\n------------\n\nMediaProvider dependencies are related to [customizations](#customization) (that\nis, if you customize MediaProvider, you must ensure your implementation meets\nthe dependency associated with your customization).\n\n- When using custom or nonstandard media file formats (for example, a format\n generated by a vendor-specific Camera app), you must register each custom\n format with `MimeUtils` and the Media Extractor module to enable indexing by\n MediaProvider.\n\n- To ensure MediaProvider indexes a custom set of storage devices (such SD card\n slots and USB ports) used in a `StorageManagerService` implementation, set the\n `VolumeInfo.MOUNT_FLAG_INDEXABLE` flag.\n\n- When using a custom (non-AOSP) MTP implementation, ensure the implementation\n relies solely on public and system APIs to enable the implementation to\n interact with MediaStore.\n\nCustomization\n-------------\n\nYou can now add new media formats, influence which storage devices are indexed,\nand replace the MTP stack.\n\n- **Custom media formats.** For each new custom media format, you must provide a\n mapping from the unique file extension to a MIME type. We strongly encourage\n you to follow the [IANA registration\n process](https://www.iana.org/assignments/media-types/media-types.xhtml).\n\n - You can't redefine an extension or MIME type that's already defined in AOSP.\n\n - For `video/*` and `audio/*` files, MediaProvider continues consulting\n `MediaMetadataRetriever`. Use the Android 10 Media Extractors to return\n metadata for custom formats.\n\n - For `image/*` files, MediaProvider continues standardizing on `Exif` for\n metadata. You can extend `android.media.ExifInterface` to extract and return\n `Exif` metadata for any custom image formats.\n\n- **Storage devices indexing flag.** MediaProvider indexes all volumes returned\n by `StorageManager.getStorageVolumes()` where\n `StorageVolume.getMediaStoreVolumeName()` is non-null. You can customize the\n list of volumes returned to influence what is indexed, but we advise against\n including transient volumes (such as USB OTG drives).\n\n- **MTP stack replacement.** Android 11 places the MTP\n stack entirely outside the module boundary and ensures that it works against\n public APIs.\n\nTesting\n-------\n\nYou can verify the functionality of MediaProvider using the following tests:\n\n- To verify the functionality of MediaStore public APIs, use tests in the\n `CtsProviderTestCases` package of the Android Compatibility Test Suite (CTS).\n\n- To verify the functionality of MediaProvider internals, use tests in\n `MediaProviderTests`.\n\nTo run both sets of tests together, use the following `atest` command: \n\n atest --test-mapping packages/providers/MediaProvider"]]