החל מ-27 במרץ 2025, מומלץ להשתמש ב-android-latest-release
במקום ב-aosp-main
כדי ליצור תרומות ל-AOSP. מידע נוסף זמין במאמר שינויים ב-AOSP.
מודול MediaProvider
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
המודול MediaProvider מבצע אופטימיזציה של מטא-נתונים שנוספו לאינדקס (אודיו, וידאו ותמונות מכרטיסי SD ומהתקני USB), ומאפשר לאפליקציות לגשת לנתונים האלה דרך ממשקי ה-API הציבוריים של 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 יוצר עכשיו אינדקס של המטא-נתונים על ידי התאמה של המטא-נתונים הזמינים לממשקי ה-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. פרטים נוספים זמינים במאמר התאמה אישית.
גבול המודול
ב-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
.
כשמשתמשים בהטמעה מותאמת אישית של MTP (לא AOSP), צריך לוודא שההטמעה מסתמכת אך ורק על ממשקי API ציבוריים וממשקי API של מערכת כדי לאפשר לה לקיים אינטראקציה עם MediaStore.
התאמה אישית
עכשיו אפשר להוסיף פורמטים חדשים של מדיה, להשפיע על מכשירי האחסון שיתווספו לאינדקס ולהחליף את מחסנית ה-MTP.
פורמטים מותאמים אישית של מדיה לכל פורמט מדיה מותאם אישית חדש, צריך לספק מיפוי מקצה הקובץ הייחודי לסוג MIME. מומלץ מאוד לפעול בהתאם לתהליך הרישום ב-IANA.
אי אפשר להגדיר מחדש תוסף או סוג MIME שכבר מוגדרים ב-AOSP.
לגבי קבצים מסוג video/*
ו-audio/*
, MediaProvider ממשיך להתייעץ עם MediaMetadataRetriever
. שימוש ב-Media Extractors של Android 10 כדי להחזיר מטא-נתונים לפורמטים מותאמים אישית.
בקובצי image/*
, MediaProvider ממשיך להשתמש ב-Exif
כפורמט סטנדרטי למטא-נתונים. אפשר להרחיב את android.media.ExifInterface
כדי לחלץ ולהחזיר את המטא-נתונים של Exif
לכל פורמט תמונה מותאם אישית.
דגל להוספה של התקני אחסון לאינדקס MediaProvider יוצר אינדקס של כל הכרכים שמוחזרים על ידי StorageManager.getStorageVolumes()
כאשר StorageVolume.getMediaStoreVolumeName()
הוא לא null. אתם יכולים להתאים אישית את רשימת האחסונים שתוחזר כדי להשפיע על מה שיתווסף לאינדקס, אבל אנחנו ממליצים לא לכלול אחסונים זמניים (כמו כונני USB OTG).
החלפת סטאק MTP ב-Android 11, סטאק ה-MTP ממוקם מחוץ לגבולות המודול ומבטיחים שהוא פועל עם ממשקי API ציבוריים.
בדיקה
אפשר לאמת את הפונקציונליות של MediaProvider באמצעות הבדיקות הבאות:
כדי לאמת את הפונקציונליות של ממשקי ה-API הציבוריים של MediaStore, משתמשים בבדיקות בחבילה CtsProviderTestCases
של ערכת בדיקות התאימות ל-Android (CTS).
כדי לאמת את הפונקציונליות של הרכיבים הפנימיים של MediaProvider, משתמשים בבדיקות ב-MediaProviderTests
.
כדי להריץ את שתי קבוצות הבדיקות יחד, משתמשים בפקודה הבאה של atest
:
atest --test-mapping packages/providers/MediaProvider
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-27 (שעון UTC).
[[["התוכן קל להבנה","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 (שעון UTC)."],[],[],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"]]