המודול 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