ב-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 ישנים יותר ומחלקות wrapper הועברו למרחב השמות android.telephony.ims.compat. כשמשדרגים ל-Android 9, מכשירים ישנים יותר צריכים לבצע את הפעולות הבאות כדי להמשיך לתמוך ב-API הישן.
- משנים את מרחב השמות של ההטמעה של ImsService כך שיוכל להשתמש ב-API של מרחב השמות
android.telephony.ims.compat. - משנים את הגדרת השירות ImsService בקובץ AndroidManifest.xml כך שישתמש בפעולה
android.telephony.ims.compat.ImsServiceשל מסנן ה-Intent, במקום בפעולהandroid.telephony.ims.ImsService.
ה-framework יתחבר ל-ImsService באמצעות שכבת התאימות שסופקה ב-Android 9 כדי לעבוד עם ההטמעה הקודמת של ImsService.
רישום של ImsService ב-framework
ממשק ה-API של ImsService מיושם כשירות, שסביבת ה-framework של Android מקשרת אליו כדי לתקשר עם ההטמעה של IMS. כדי לרשום אפליקציה שמטמיעה ImsService ב-framework, צריך לבצע שלושה שלבים. קודם כול, ההטמעה של 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 שמשולבים במסגרת, עדיין יש יתרונות בהצהרה על 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 של ספק עם 'החלפה' או כהגדרות ImsService 'ברירת מחדל' של המכשיר עבור פונקציונליות MMTEL או RCS.
בנוסף, שירות ImsService מאפשר להפעיל או להשבית באופן דינמי את תכונות ה-IMS שהוא תומך בהן (MMTEL ו-RCS) באמצעות עדכונים בשיטה ImsService#onUpdateSupportedImsFeatures. הפעולה הזו גורמת למסגרת לחשב מחדש אילו שירותי IMS קשורים ואילו תכונות הם תומכים בהן. אם אפליקציית ה-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 הזה חייב לתמוך בתכונת ה-MmTel לחירום.
אם ה-ImsService שלכם יהיה ברירת המחדל, כמו שמוגדר למעלה, אתם צריכים להגדיר את שם החבילה שלו ב-CarrierConfig לכל אחד מהספקים שישתמשו בחבילה הזו או בשכבת העל של המכשיר.
בואו נפרט על כל תכונה. במכשיר (עם כרטיס SIM אחד או כמה כרטיסי SIM) שמוטען בו כרטיס SIM אחד, אפשר להשתמש בשתי תכונות של IMS: MMTel ו-RCS. המסגרת תנסה לבצע את הקישור לפי הסדר שמוגדר למעלה לכל תכונה, ואם התכונה לא זמינה ל-ImsService שמוגדר בביטול ברירת המחדל של CarrierConfiguration, המסגרת תחזור ל-ImsService שמוגדר כברירת המחדל. לדוגמה, בטבלה הבאה מתואר באיזו תכונה של IMS ישתמש ה-framework אם שלוש אפליקציות של IMS שמטמיעות את ImsServices מותקנות במערכת עם התכונות הבאות:
- ספק א' ImsService תומך ב-RCS
- ImsService של ספק ב' תומך ב-RCS וב-MMTel
- ImsService של OEM תומך ב-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, מומלץ שהאפליקציה תירשם קודם לקבלת קריאה חוזרת (callback) של סטטוס 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.