ב-Android 9 נוסף ממשק SystemApi חדש בשם ImsService שעוזר להטמיע את מערכת המשנה של IP Multimedia (IMS). ממשק ImsService API הוא ממשק מוגדר היטב בין פלטפורמת 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
של מסנן הכוונה, במקום בפעולהandroid.telephony.ims.ImsService
.
לאחר מכן, המסגרת תקשר ל-ImsService באמצעות שכבת התאימות שסופקה ב-Android 9 כדי לפעול עם ההטמעה הקודמת של ImsService
.
רישום ImsService במסגרת
ממשק ה-API של ImsService מיושם כשירות, שאליו ה-framework של Android מתחבר כדי לתקשר עם הטמעת ה-IMS. כדי לרשום אפליקציה שמטמיעה ImsService באמצעות המסגרת, צריך לבצע שלושה שלבים. קודם כול, הטמעת ImsService צריכה להירשם בפלטפורמה באמצעות AndroidManifest.xml
של האפליקציה. שנית, היא צריכה להגדיר אילו תכונות IMS יהיו נתמכות בהטמעה (MmTel או RCS). שלישית, היא צריכה להיות מאומתת כטמעת IMS מהימנה, בהגדרות הספק או בשכבת-העל של המכשיר.
הגדרת השירות
אפליקציית ה-IMS רושמת ImsService במסגרת על ידי הוספת רשומה 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, צריך להגדיר ב-ImsService את התכונות של 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
, ברירת המחדל של הפלטפורמה תמיד תהיה Fallback של Circuit Switch לשירותי חירום. כדי להגדיר את התכונה FEATURE_MMTEL
צריך להגדיר את התכונה.
FEATURE_RCS
ה-ImmsService API לא מיישם תכונות IMS RCS, אבל מחלקת הבסיס android.telephony.ims.RcsFeature
עדיין יכולה להיות שימושית. ה-framework מקשרת באופן אוטומטי ל-IMsService וקוראת ל-ImsService#createRcsFeature
כשהיא מזהה שהחבילה צריכה לספק RCS. אם כרטיס ה-SIM שמשויך לשירות ה-RCS יוסר, המסגרת תפנה באופן אוטומטי ל-RcsFeature#onFeatureRemoved
ולאחר מכן תנקה את ה-ImsService
שמשויך לתכונה RCS. הפונקציה הזו יכולה להסיר חלק מהלוגיקה בהתאמה אישית של זיהוי או קישור, שהתכונה RCS הייתה צריכה לספק אחרת.
רישום של תכונות נתמכות
מסגרת הטלפונייה קושרת קודם ל-ImsService כדי לשלוח שאילתה לגבי התכונות שהיא תומכת בהן באמצעות ה-API ImsService#querySupportedImsFeatures
. אחרי ש-framework מחשב אילו תכונות של ImsService יתמוך, היא תבצע קריאה ל-ImsService#create[...]Feature
לכל מאפיין שה-IMsService יהיה אחראי עליה. אם התכונות שאפליקציית IMS תומכת בהן, אפשר להשתמש ב-ImsService#onUpdateSupportedImsFeatures
כדי לסמן ל-framework לחשב מחדש את התכונות הנתמכות. אפשר לעיין בתרשים הבא כדי לקבל מידע נוסף על האינטראקציה הראשונית והקישור של ImsService.
איור 2: איפוס וקישור של ImsService
זיהוי ואימות של Framework של הטמעת ImsService
אחרי שמגדירים את ImsService בצורה נכונה ב-AndroidManifest.xml, צריך להגדיר את הפלטפורמה כך שתקשר (באופן מאובטח) ל-ImsService במקרים הרלוונטיים. יש שני סוגים של ImsServices שהמסגרת מקשרת אליהם:
- IMsService של הספק מבטל את ההסכמה: ה-IMsServices האלה נטענים מראש למכשיר, אבל מחוברים לספק סלולרי אחד או יותר, ויהיו מקושרים רק לאחר הכנסת כרטיס 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
: הטמעת תכונות של MMTELconfig_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
. הפעולה הזו מפעילה את המסגרת כדי לחשב מחדש אילו ImsServices מקושרים ואילו תכונות הם תומכים בהן. אם אפליקציית IMS תעדכן את ה-framework ללא תכונות נתמכות, ה-IMSService לא יפעל מחדש עד שהטלפון יופעל מחדש או יוכנס כרטיס SIM חדש שתואם לאפליקציית IMS.
תעדוף קישור של כמה ImsService
ה-framework לא יכול לתמוך בקישור לכל השירותים האפשריים של ImsServices שנטענים מראש במכשיר, ותחייב אותם לכל חריץ SIM (שירות ImsService אחד לכל תכונה) בסדר הבא לכל תכונה:
- שם החבילה של ImsService שמוגדר לפי הערך
config_ims_[mmtel/rcs]_package_override_string
של CarrierConfig כשכרטיס SIM מוכנס. - שם החבילה של ImsService שמוגדר בערך שכבת-העל של המכשיר עבור
config_ims_[mmtel/rcs]_package
, כולל במקרה שבו לא הוכנס כרטיס SIM. שירות ImsService חייב לתמוך בתכונה MmTel למקרי חירום.
שם החבילה של ה-IMsService צריך להיות מוגדר ב-CarrierConfig לכל אחד מהספקים שישתמשו בחבילה הזו, או בשכבת-העל של המכשיר אם ה-IMsService יוגדר כברירת מחדל כפי שהוגדר למעלה.
נבחן את הנושא הזה לגבי כל תכונה. במכשיר (עם כרטיס SIM יחיד או עם כמה כרטיסי SIM) שמוכנס אליו כרטיס SIM אחד, אפשר להשתמש בשתי תכונות IMS: MMTel ו-RCS. המסגרת תנסה לבצע קישור לפי הסדר שמוגדר למעלה לכל תכונה, ואם התכונה לא זמינה ל-ImsService שמוגדר בשינוי ההגדרה של הספק, המסגרת תעבור ל-ImsService שמוגדר כברירת מחדל. לדוגמה, בטבלה הבאה מתואר איזו תכונת IMS המערכת תשתמש בה, בהתאם לשלוש אפליקציות IMS שמטמיעות את ImsServices שמותקנות במערכת עם התכונות הבאות:
- שירות Ims של ספק A תומך ב-RCS
- שירות Ims של ספק B תומך ב-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
או הכיתה הספציפית ל-IMS ProvisioningManager
. לאחר מכן האפליקציה יכולה להאזין לסטטוסים ספציפיים של שירותי IMS והקצאות, כמו:
- תכונות MMTEL או RCS שפועלות וזמינות
- עדכונים כשמצב הרישום של IMS משתנה
- סטטוס ההקצאה של תכונות IMS
- תכונות IMS שהמשתמש הפעיל
שימוש ב-imsStateCallback
ImsService הוא שירות שמקושר באופן קבוע, אבל השירות שמקושר עשוי להשתנות כשכרטיס SIM חדש או מינוי מוטמע הופכים לפעילים, או כשהגדרת הספק משתנה. מכיוון ש-ImsService לא נכלל בתהליך הטלפוני, יכול להיות שתופיעו באפליקציה חריגות בלתי צפויות כשהיא תנסה לגשת לממשקי ה-API של IMS, אם ImsService יתרסק באופן בלתי נראה או לא יהיה מקושר בגלל שינוי במינוי או בהגדרה.
במכשירים עם Android מגרסה 13 ואילך, כדי לעקוב אחרי זמינות המופע של ImsService עבור מינוי משויך, אפליקציה יכולה להשתמש בכיתה ImsStateCallback
. כשמקבלים מופע של ImsMmTelManager
או ImsRcsManager
, מומלץ שהאפליקציה תירשם קודם לקריאה חוזרת למצב IMS באמצעות ImsMmTelManager#registerImsStateCallback
או ImsRcsManager#registerImsStateCallback
.
כדי להמשיך לקבל עדכונים של קריאה חוזרת למינויים ספציפיים כש-ImsService יחזור להיות זמין, האפליקציה צריכה לבטל את הרישום או למחוק את הקריאות החוזרות הקיימות שנרשמו דרך ImsMmTelManager
, ImsRcsManager
או
ProvisioningManager
, ולרשום קריאות חוזרות חדשות.
אם יש מינוי שלא תומך ב-IMS, תתבצע קריאה ל-framework
ImsStateCallback#onUnavailable
עם הסיבה
REASON_NO_IMS_SERVICE_CONFIGURED
.
המשמעות היא ש-ImsService וממשקי ה-API שקשורים ל-IMS לא זמינים במינוי.
במקרה הלא סביר שבו תהליך הטלפון יתרסק, האפליקציה תקבל את הערך ImsStateCallback#onError
ולא תקבל יותר עדכונים במכונה הרשומה של ImsStateCallback
.
כדי לצאת מהמצב הזה, צריך לרשום מחדש את המכונה ImsStateCallback
למינוי המשויך באמצעות קריאה ל-ImsMmTelManager#registerImsStateCallback
או ל-ImsRcsManager#registerImsStateCallback
.