ماژول MediaProvider

ماژول MediaProvider ابرداده های نمایه شده (صوتی، ویدئو، و تصاویر از کارت های SD و دستگاه های USB) را بهینه می کند و آن داده ها را از طریق API های عمومی MediaStore در دسترس برنامه ها قرار می دهد. برای حفظ حریم خصوصی کاربر، ماژول MediaProvider مدل امنیتی فضای ذخیره‌سازی محدوده معرفی شده در اندروید 10 را اعمال می‌کند، که شامل ویرایش ابرداده‌های حساس موقعیت مکانی است. این ماژول قابل به‌روزرسانی است و اندروید را قادر می‌سازد تا به مسائل امنیتی سریع‌تر پاسخ دهد (حفظ داده‌های حساس کاربر) و قالب‌های رسانه جدید را سریع‌تر اضافه کند (برای کاربران و توسعه‌دهندگان سازگاری ایجاد می‌کند).

تغییرات اندروید 10

اندروید 10 چندین بهبود مربوط به شناسایی و استخراج داده ها از فایل های رسانه ای را معرفی کرد، به ویژه:

  • تعیین نوع محتوای فایل با استفاده از قسمت اول نوع MIME یک فایل. به عنوان مثال، سیستم عامل می داند که هر دو فرمت image/png و image/x-newly-invented-format تصاویر هستند، و بنابراین می تواند مجوزهای مربوطه را به طور دقیق برای کاربر نهایی توصیف کند.

  • تعیین نوع MIME فقط با استفاده از پسوند فایل (و بدون استفاده از sniffing محتوا برای جلوگیری از مشکلات امنیتی).

  • تعیین نوع MIME یک فایل دلخواه با استفاده از ترکیبی از دبیان لینوکس بالادست و نگاشت اندروید .

  • بازگرداندن داده‌های مرتبط از فایل‌های video/* و audio/* (از طریق MediaMetadataRetriever ) و فایل‌های image/* (از طریق ExifInterface ).

تغییرات اندروید 11

در اندروید 11، ماژول MediaProvider بر اساس تغییرات ایجاد شده در اندروید 10 با بهبودهای زیر ساخته شده است:

  • بهبود در نمایه سازی ماژول MediaProvider اکنون ابرداده‌ها را با تطبیق ابرداده‌های موجود با APIهای عمومی MediaStore فهرست‌بندی می‌کند. تغییرات عبارتند از:

    • ستون is_favorite و آرگومان QUERY_ARG_MATCH_FAVORITE جدید برای فعال کردن برنامه‌های سبک گالری برای فیلتر کردن سریع رسانه بر اساس این ستون.

    • نمایه سازی فراداده فضای رنگی

    • ستون «is_trashed» جدید و آرگومان QUERY_ARG_MATCH_TRASHED برای فعال کردن برنامه‌های سبک گالری برای فیلتر کردن بر اساس این ستون.

    • API های جدیدی که امکان اصلاح انبوه چندین آیتم را با یک فرمان محاوره ای کاربر فراهم می کند، از جمله createDeleteRequest() ، createFavoriteRequest() ، createTrashRequest() و createWriteRequest() .

    • ستون های جدید GENERATION_ADDED و GENERATION_MODIFIED برای استفاده در تشخیص سریع و مطمئن تغییراتی که از نقطه همگام سازی قبلی رخ داده است.

    • API جدید GROUP BY عمومی برای استفاده با ستون‌های فراداده اضافی که در بالا ذکر نشده است.

  • بهبود ExifInterface برای استخراج ابرداده از کانتینرهای PNG و WebP.

  • بهبودهایی در SystemUI برای نوشتن ابرداده DateTimeOriginal در عکسبرداری از صفحه نمایش.

علاوه بر این، اکنون می‌توانید MediaProvider را با افزودن فرمت‌های رسانه‌ای جدید، علامت‌گذاری دستگاه‌های ذخیره‌سازی ایندکس و حتی جایگزینی پشته MTP سفارشی کنید. برای جزئیات، به سفارشی سازی مراجعه کنید.

مرز ماژول

اندروید 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)، مطمئن شوید که پیاده‌سازی تنها به APIهای عمومی و سیستم متکی است تا پیاده‌سازی را برای تعامل با 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 را کاملاً خارج از مرز ماژول قرار می دهد و اطمینان می دهد که در برابر API های عمومی کار می کند.

آزمایش کردن

با استفاده از تست های زیر می توانید عملکرد MediaProvider را تأیید کنید:

  • برای تأیید عملکرد APIهای عمومی MediaStore، از آزمایش‌های موجود در بسته CtsProviderTestCases مجموعه تست سازگاری Android (CTS) استفاده کنید.

  • برای تأیید عملکرد داخلی MediaProvider، از آزمایشات در MediaProviderTests استفاده کنید.

برای اجرای هر دو مجموعه تست با هم، از دستور atest زیر استفاده کنید:

atest --test-mapping packages/providers/MediaProvider