מודול MediaProvider

המודול MediaProvider מבצע אופטימיזציה של מטא-נתונים שנוספו לאינדקס (אודיו, וידאו ותמונות מכרטיסי SD ומהתקני USB), ומאפשר לאפליקציות לגשת לנתונים האלה דרך ממשקי ה-API הציבוריים של MediaStore. כדי לשמור על פרטיות המשתמשים, המודול MediaProvider אוכף את נפח האחסון בהיקף אבטחה מודל שהושקה ב-Android 10, כולל צנזור מטא-נתונים רגישים של מיקום. אפשר לעדכן את המודול הזה, וכך לאפשר ל-Android להגיב מהר יותר לבעיות אבטחה (שמירה על הגנה על נתונים רגישים של משתמשים) ולהוסיף פורמטים חדשים של מדיה מהר יותר (שמירה על עקביות למשתמשים ולמפתחים).

שינויים ב-Android 10

ב-Android 10 נוספו כמה שיפורים שקשורים לזיהוי ולחילוץ נתונים מקובצי מדיה, באופן ספציפי:

  • קביעת סוג התוכן של הקובץ באמצעות החלק הראשון של סוג ה-MIME של הקובץ. לדוגמה, מערכת ההפעלה יודעת שגם image/png וגם image/x-newly-invented-format הן תמונות, ולכן היא יכולה לתאר במדויק את ההרשאות הרלוונטיות למשתמש הקצה.

  • זיהוי סוג ה-MIME באמצעות סיומת הקובץ בלבד (וללא שימוש בניפוי תוכן כדי למנוע בעיות אבטחה).

  • קביעת סוג ה-MIME של קובץ שרירותי באמצעות שילוב של upstream ב-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 ציבוריים והמערכת כדי לאפשר את ההטמעה ליצור אינטראקציה עם 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 Compatibility Test Suite‏ (CTS).

  • כדי לאמת את הפונקציונליות של MediaProvider פנימי, צריך להשתמש בבדיקות MediaProviderTests

כדי להריץ את שתי קבוצות הבדיקות יחד, משתמשים בפקודה הבאה של atest:

atest --test-mapping packages/providers/MediaProvider