מודול MediaProvider

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

שינויים ב-Android 10

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

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

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

  • קביעת סוג ה-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 חלץ כדי לאפשר הוספה לאינדקס על ידי MediaProvider.

  • כדי לוודא ש-MediaProvider יוצר אינדקס של קבוצה מותאמת אישית של התקני אחסון (כמו חריצי כרטיסי SD ויציאות USB) שמשמשים בהטמעה של StorageManagerService, צריך להגדיר את הדגל VolumeInfo.MOUNT_FLAG_INDEXABLE.

  • כשמשתמשים בהטמעת MTP בהתאמה אישית (לא AOSP), חשוב לוודא שההטמעה מסתמכת רק על ממשקי API ציבוריים והמערכת כדי לאפשר ליישום אינטראקציה עם MediaStore.

התאמה אישית

עכשיו אפשר להוסיף פורמטים חדשים של מדיה, להשפיע על מכשירי האחסון שיתווספו לאינדקס ולהחליף את סטאק ה-MTP.

  • פורמטים מותאמים אישית של מדיה. לכל פורמט מדיה מותאם אישית חדש, צריך לספק מיפוי מסיומת הקובץ הייחודית לסוג MIME. מומלץ מאוד לפעול לפי תהליך הרישום של IANA.

    • אי אפשר להגדיר מחדש תוסף או סוג MIME שכבר מוגדרים ב-AOSP.

    • לגבי קבצים מסוג video/* ו-audio/*, MediaProvider ממשיך להתייעץ עם MediaMetadataRetriever. אפשר להשתמש בכלי החילוץ של מדיה ב-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 Compliance Test Suite (CTS).

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

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

atest --test-mapping packages/providers/MediaProvider