ב-Android 9 מוצג ממשק SystemApi בשם ImsService, שמיועד לעזור לכם להטמיע את מערכת המשנה IP Multimedia Subsystem (IMS). ממשק ה-API של ImsService הוא ממשק מוגדר היטב בין פלטפורמת Android לבין הטמעה של IMS שסופקה על ידי ספק או ספק סלולר.
איור 1. סקירה כללית על ImsService
באמצעות הממשק ImsService, המפתח של IMS יכול לספק לפלטפורמה מידע חשוב על האיתות, כמו פרטי רישום של IMS, שילוב של SMS דרך IMS ושילוב של תכונות MmTel כדי לספק שיחות קוליות ושיחות וידאו. ImsService API הוא גם Android System API, כלומר אפשר לבנות אותו ישירות מול Android SDK במקום מול המקור. אפשר גם להגדיר אפליקציית IMS שהותקנה מראש במכשיר כך שניתן יהיה לעדכן אותה דרך חנות Play.
דוגמאות ומקור
Android מספק אפליקציה ב-AOSP שמטמיעה חלקים מ-ImsService API למטרות בדיקה ופיתוח. האפליקציה נמצאת בנתיב /testapps/ImsTestService.
אפשר למצוא את התיעוד של ImsService API ב-ImsService ובמחלקות אחרות ב-API.
הטמעה
ImsService API הוא API ברמה גבוהה שמאפשר לכם להטמיע IMS בדרכים רבות, בהתאם לחומרה הזמינה. לדוגמה, שינויי ההטמעה משתנים בהתאם לשאלה אם הטמעת ה-IMS מתבצעת באופן מלא במעבד של האפליקציה, או אם היא מועברת באופן חלקי או מלא למודם. מערכת Android לא מספקת HAL ציבורי להעברה למעבד פס הבסיס, ולכן כל העברה צריכה להתבצע באמצעות תוסף ה-HAL למודם.
תאימות להטמעות ישנות יותר של IMS
למרות ש-Android 9 כולל את ImsService API, מכשירים שמשתמשים בהטמעה ישנה יותר של IMS לא יכולים לתמוך ב-API.
במכשירים האלה, ממשקי ה-AIDL הישנים ומחלקות העטיפה הועברו למרחב השמות android.telephony.ims.compat
. כשמשדרגים ל-Android 9, מכשירים ישנים יותר צריכים לבצע את הפעולות הבאות כדי להמשיך לתמוך ב-API הישן.
- משנים את מרחב השמות של ההטמעה של ImsService כך שיתבסס על ה-API של מרחב השמות
android.telephony.ims.compat
. - משנים את הגדרת השירות ImsService בקובץ AndroidManifest.xml כך שישתמשו בפעולה
android.telephony.ims.compat.ImsService
intent-filter במקום בפעולהandroid.telephony.ims.ImsService
.
ה-framework יתחבר ל-ImsService באמצעות שכבת התאימות שסופקה ב-Android 9 כדי לפעול עם ההטמעה הקודמת של ImsService
.
רישום של ImsService ב-Framework
ממשק ה-API של ImsService מיושם כשירות, שסביבת ה-framework של Android מתחברת אליו כדי לתקשר עם יישום ה-IMS. כדי לרשום אפליקציה שמטמיעה ImsService באמצעות המסגרת, צריך לבצע שלושה שלבים. קודם כול, ההטמעה של ImsService צריכה להירשם בפלטפורמה באמצעות AndroidManifest.xml
של האפליקציה. אחר כך, היא צריכה להגדיר אילו תכונות IMS נתמכות בהטמעה (MmTel או RCS). ולבסוף, היא צריכה להיות מאומתת כהטמעה מהימנה של IMS בהגדרת הספק או בשכבת העל של המכשיר.
הגדרת השירות
אפליקציית ה-IMS רושמת ImsService ב-framework באמצעות הוספה של רשומה service
למניפסט בפורמט הבא:
<service
android:name="com.egcorp.ims.EgImsService"
android:directBootAware="true"
Android:persistent="true"
...
android:permission="android.permission.BIND_IMS_SERVICE" >
...
<intent-filter>
<action android:name="android.telephony.ims.ImsService" />
</intent-filter>
</service>
ההגדרה של service
ב-AndroidManifest.xml
מגדירה את המאפיינים הבאים, שנדרשים לפעולה תקינה:
-
directBootAware="true"
: מאפשר לשירות להתגלות ולפעול על ידיtelephony
לפני שהמשתמש פותח את נעילת המכשיר. השירות לא יכול לגשת לאחסון מוצפן במכשיר לפני שהמשתמש מבטל את הנעילה של המכשיר. מידע נוסף זמין במאמרים בנושא תמיכה במצב אתחול ישיר והצפנה מבוססת-קבצים. -
persistent="true"
: מאפשרת להפעיל את השירות הזה באופן קבוע, כך שהמערכת לא תסגור אותו כדי לפנות זיכרון. המאפיין הזה פועל רק אם האפליקציה בנויה כאפליקציית מערכת. -
permission="android.permission.BIND_IMS_SERVICE"
: מוודאת שרק תהליך שקיבל את ההרשאהBIND_IMS_SERVICE
יכול להתחבר לאפליקציה. כך נמנעת אפשרות של אפליקציה זדונית להתחבר לשירות, כי רק אפליקציות מערכת יכולות לקבל את ההרשאה מהמסגרת.
בנוסף, השירות צריך לציין את רכיב intent-filter
עם הפעולה android.telephony.ims.ImsService
. כך המסגרת יכולה למצוא את ImsService
.
מפרט תכונות IMS
אחרי שמגדירים את ImsService כשירות Android בקובץ AndroidManifest.xml, צריך להגדיר את תכונות ה-IMS שהשירות תומך בהן. בשלב הזה, מערכת Android תומכת בתכונות MmTel ו-RCS, אבל רק MmTel משולבת במסגרת. למרות שאין ממשקי API של RCS שמשולבים במסגרת, עדיין יש יתרונות להצהרה על כך שהיא תכונה של ImsService.
בהמשך מפורטות התכונות התקפות שמוגדרות ב-android.telephony.ims.ImsFeature
שאפשר לספק באמצעות ImsService, ומוסבר למה אפליקציית IMS תרצה להטמיע אחת או יותר מהתכונות האלה. אחרי שכל תכונה מוגדרת, בדף הזה מוסבר איך ImsService
מכריז על קבוצת התכונות שהוא מגדיר לכל חריץ SIM.
FEATURE_MMTEL
ImsService
מיישם את התכונה IMS MMTEL, שכוללת תמיכה בכל המדיה של IMS (מפרטים IR.92 ו-IR.94) חוץ מצירוף חירום ל-IMS PDN לשיחות חירום. כל הטמעה של ImsService
שרוצים לתמוך בתכונות של MMTEL צריכה להרחיב את מחלקת הבסיס android.telephony.ims.MmTelFeature
ולהחזיר הטמעה מותאמת אישית של MmTelFeature
ב-ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
ההצהרה על התכונה הזו רק מסמנת לפלטפורמה שאפשר להתחבר ל-IMS PDN לשירותי חירום. אם התכונה הזו לא מוצהרת עבור ImsService
, הפלטפורמה תמיד תעבור אוטומטית ל-Circuit Switch Fallback בשביל שירותי חירום. כדי להגדיר את התכונה הזו, צריך להגדיר את התכונה FEATURE_MMTEL
.
FEATURE_RCS
ממשק ה-API של ImsService לא מטמיע תכונות של IMS RCS, אבל מחלקת הבסיס android.telephony.ims.RcsFeature
עדיין יכולה להיות שימושית. המסגרת נקשרת אוטומטית ל-ImsService וקוראת ל-ImsService#createRcsFeature
כשהיא מזהה שהחבילה צריכה לספק RCS. אם כרטיס ה-SIM שמשויך לשירות RCS מוסר, המסגרת קוראת אוטומטית ל-RcsFeature#onFeatureRemoved
ואז מנקה את ImsService
שמשויך לתכונת RCS. התכונה הזו יכולה להסיר חלק מהלוגיקה של זיהוי או קישור מותאמים אישית, שאחרת תכונת RCS הייתה צריכה לספק.
רישום של תכונות נתמכות
מסגרת הטלפוניה מתחברת קודם ל-ImsService כדי לשלוח שאילתה לגבי התכונות שהיא תומכת בהן באמצעות ImsService#querySupportedImsFeatures
API. אחרי שהמסגרת מחשבת אילו תכונות יתמכו ב-ImsService, היא תקרא ל-ImsService#create[...]Feature
לכל תכונה ש-ImsService יהיה אחראי לה. אם יש שינויים בתכונות שאפליקציית ה-IMS תומכת בהן, אפשר להשתמש ב-ImsService#onUpdateSupportedImsFeatures
כדי לאותת למסגרת לחשב מחדש את התכונות הנתמכות. למידע נוסף על ההפעלה והקישור של ImsService, אפשר לעיין בתרשים הבא.
איור 2. הפעלה וכבילה של ImsService
זיהוי מסגרת ואימות של הטמעה של ImsService
אחרי שמגדירים את ImsService בצורה נכונה ב-AndroidManifest.xml, צריך להגדיר את הפלטפורמה כך שתתבצע אליה (באופן מאובטח) קישוריות כשצריך. יש שני סוגים של ImsServices שהמסגרת נקשרת אליהם:
- Carrier "override" ImsService: שירותי ה-ImsService האלה נטענים מראש במכשיר, אבל הם משויכים לספקים סלולריים אחדים או יותר, והם יקושרו רק כשיוכנס כרטיס SIM תואם. ההגדרה הזו מתבצעת באמצעות
config_ims_mmtel_package_override_string
מפתח CarrierConfig ל-ImsServices שמטמיע תכונות של MMTEL.-
config_ims_rcs_package_override_string
ל-ImsServices שמטמיע תכונות של RCS.
- ImsService 'ברירת מחדל' של המכשיר: זהו ה-ImsService שנטען במכשיר על ידי יצרן ציוד מקורי (OEM) ונועד לספק שירותי IMS בכל המצבים שבהם לא זמין ImsService של ספק סלולר. הוא שימושי במצבים שבהם לא מוכנס כרטיס SIM למכשיר או שכרטיס ה-SIM שהוכנס לא כולל ImsService של ספק סלולר. ההגדרה הזו מוגדרת בשכבת העל של המכשיר באמצעות ההגדרות הבאות:
-
config_ims_mmtel_package
: הטמעה של תכונות MMTEL -
config_ims_rcs_package
: מטמיע תכונות של RCS
-
Android לא תומך באפליקציות עם הטמעות של ImsService שאפשר להוריד מצד שלישי, ולכן כל הטמעה של ImsService שמוגדרת כאן חייבת להיות אפליקציית מערכת, והיא צריכה להיות בתיקייה /system/priv-app/ או /product/priv-app/ כדי להעניק את ההרשאות המתאימות (כלומר, הרשאות לשימוש בטלפון, במיקרופון, במיקום, במצלמה ובאנשי הקשר). כדי לוודא שרק אפליקציות מהימנות שמותקנות מראש יקושרו, צריך לבדוק אם שם החבילה של הטמעת ה-IMS תואם לערכים של CarrierConfig או של שכבת העל של המכשיר שמוגדרים למעלה.
התאמה אישית
אפליקציות שמטמיעות ImsService נקשרות רק במכשירים שבהם הן מוגדרות כ-ImsService של ספק ש"עוקף" את הגדרות ברירת המחדל של המכשיר, או כהגדרות ברירת המחדל של המכשיר עבור פונקציונליות של MMTEL או RCS.
ה-ImsService גם מאפשר להפעיל או להשבית באופן דינמי את תכונות ה-IMS שהוא תומך בהן (MMTEL ו-RCS) באמצעות עדכונים בשיטה ImsService#onUpdateSupportedImsFeatures
. הפעולה הזו גורמת למסגרת לחשב מחדש אילו ImsServices קשורים ואילו תכונות הם תומכים. אם אפליקציית ה-IMS מעדכנת את המסגרת בלי תכונות נתמכות, ה-ImsService לא יבוטל עד שהטלפון יופעל מחדש או עד שיוכנס כרטיס SIM חדש שתואם לאפליקציית ה-IMS.
סדר העדיפות של הקישור לכמה ImsService
המסגרת לא יכולה לתמוך באיגוד לכל שירותי ה-IMS האפשריים שנטענים מראש במכשיר, והיא תתאגד לעד שני שירותי IMS לכל חריץ SIM (שירות IMS אחד לכל תכונה) בסדר הבא על בסיס תכונה:
- שם חבילת ImsService שמוגדר על ידי הערך CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
כשיש כרטיס SIM מוכנס. - שם החבילה של ImsService מוגדר בערך של שכבת העל של המכשיר עבור
config_ims_[mmtel/rcs]_package
, כולל המקרה שבו לא מוכנס כרטיס SIM. שירות ה-IMS הזה חייב לתמוך בתכונה Emergency MmTel.
אם ה-ImsService שלכם יהיה ברירת המחדל, כמו שמוגדר למעלה, תצטרכו להגדיר את שם החבילה של ה-ImsService ב-CarrierConfig לכל אחד מהספקים שישתמשו בחבילה הזו, או בשכבת העל של המכשיר.
בואו נפרט את זה לגבי כל תכונה. במכשיר (עם כרטיס SIM אחד או כמה כרטיסי SIM) שמוטען בו כרטיס SIM אחד, אפשר להשתמש בשתי תכונות IMS: MMTel ו-RCS. המסגרת תנסה לבצע את הקישור לפי הסדר שמוגדר למעלה לכל תכונה. אם התכונה לא זמינה ל-ImsService שמוגדר בשינוי ברירת המחדל של CarrierConfiguration, המסגרת תחזור ל-ImsService שמוגדר כברירת המחדל. לדוגמה, בטבלה הבאה מתואר באיזו תכונה של IMS ישתמש ה-framework אם שלוש אפליקציות IMS שמטמיעות את ImsServices מותקנות במערכת עם התכונות הבאות:
- ספק א' ImsService תומך ב-RCS
- ספק ב' ImsService תומך ב-RCS וב-MMTel
- OEM ImsService תומך ב-RCS וב-MMTel
הכנסת כרטיס SIM | תכונת RCS | תכונת MMTel |
---|---|---|
ספק א' | ספק א' | OEM (יצרן ציוד מקורי) |
ספק ב' | ספק ב' | ספק ב' |
אין כרטיס SIM | OEM (יצרן ציוד מקורי) | OEM (יצרן ציוד מקורי) |
אימות
הכלים לאימות ההטמעה של IMS עצמה לא נכללים, כי המפרטים של IMS גדולים מאוד וצריך להשתמש בציוד אימות מיוחד. הבדיקות יכולות רק לאמת שמסגרת הטלפוניה מגיבה כראוי ל-ImsService API.
פיתוח אפליקציית IMS
כשמפתחים אפליקציית IMS שיוצרת אינטראקציה עם מחסנית הטלפוניה של Android, מומלץ לציין שהאפליקציה יכולה להאזין למצב של מופע ImsService שמצורף למינוי ספציפי אצל ספק סלולר או לשנות את המצב שלו.
כדי להתעדכן בסטטוס של ImsService או לשנות אותו עבור תכונות MMTEL ו-RCS, צריך להשתמש במחלקה ImsManager
כדי לקבל מופע של ImsMmTelManager
, ImsRcsManager
או המחלקה ProvisioningManager
הספציפית ל-IMS. לאחר מכן האפליקציה יכולה להאזין למצבי שירות והקצאה ספציפיים ל-IMS, כמו:
- תכונות MMTEL או RCS שמופעלות וזמינות
- מתעדכן כשסטטוס ההרשמה ל-IMS משתנה
- סטטוס הקצאת ההרשאות של תכונות IMS
- תכונות IMS שהמשתמש הפעיל
שימוש ב-ImsStateCallback
למרות ש-ImsService הוא שירות שקשור באופן קבוע, השירות שקשור עשוי להשתנות כשכרטיס SIM חדש או מינוי מוטמע הופכים לפעילים, או כשמשתנה הגדרת חברת הסלולר. מכיוון ש-ImsService לא מהווה חלק מתהליך הטלפוניה, יכול להיות שבאפליקציה יתרחשו חריגים לא צפויים כשמנסים לגשת לממשקי API של IMS אם ImsService קורס באופן בלתי נראה או לא מאוגד בגלל שינוי במינוי או בהגדרה.
במכשירים עם Android מגרסה 13 ואילך, אפליקציה יכולה להשתמש במחלקה ImsStateCallback
כדי לעקוב אחרי הזמינות של מופע ImsService למינוי משויך. כשמקבלים מופע של ImsMmTelManager
או ImsRcsManager
, מומלץ שהאפליקציה תירשם קודם לקבלת קריאה חוזרת של סטטוס IMS באמצעות ImsMmTelManager#registerImsStateCallback
או ImsRcsManager#registerImsStateCallback
.
כדי להמשיך לקבל עדכונים על התקשרות חוזרת לגבי מינויים ספציפיים כשהשירות ImsService יהיה זמין שוב, האפליקציה צריכה לבטל את הרישום של ההתקשרויות החוזרות הקיימות שנרשמו דרך ImsMmTelManager
, ImsRcsManager
או ProvisioningManager
, או לבטל את ההתקשרויות החוזרות האלה, ולרשום התקשרויות חוזרות חדשות.
אם יש מינוי שלא תומך ב-IMS, המסגרת קוראת ל-ImsStateCallback#onUnavailable
עם הסיבה REASON_NO_IMS_SERVICE_CONFIGURED
.
המשמעות היא ש-ImsService וממשקי ה-API שקשורים ל-IMS לא זמינים במינוי.
במקרה הלא סביר שתהליך הטלפוניה קורס, האפליקציה מקבלת את הערך
ImsStateCallback#onError
ולא מקבלת יותר עדכונים לגבי מופע ImsStateCallback
הרשום.
כדי לצאת מהמצב הזה, צריך לרשום מחדש את מופע ImsStateCallback
למינוי המשויך על ידי קריאה ל-ImsMmTelManager#registerImsStateCallback
או ל-ImsRcsManager#registerImsStateCallback
.