בגרסה 6.0 ואילך של Android יש יכולת לאפליקציות בעלות הרשאות להעביר לפלטפורמה הגדרות ספציפיות לספק. הפונקציונליות הזו, שמבוססת על הרשאות הספק של UICC שהוצגו ב-Android 5.1 (Lollipop MR1), מאפשרת להעביר את הגדרות הספק מהשכבות העליונות של ההגדרות הסטטיות, ומעניקה לספקים וליצרני ציוד מקורי (OEM) את היכולת לספק הגדרות של ספק באופן דינמי לפלטפורמה דרך ממשק מוגדר.
אם אפליקציית ספק חתומה כראוי, אפשר לטעון מראש בתמונת המערכת, להתקין אותה אוטומטית או להתקין אותה באופן ידני דרך חנות אפליקציות. הפלטפורמה שולחת לאפליקציה שאילתה כדי לקבל הגדרות, כולל:
- רשתות נדידה/לא נדידה
- דואר קולי ויזואלי
- הגדרות הרשת של SMS/MMS
- הגדרות VoLTE/IMS
ההחלטה לגבי הערכים להחזרתם היא אך ורק של אפליקציית הספק, והיא יכולה להיות דינמית על סמך מידע מפורט שמוענק לאפליקציה דרך הפלטפורמה.
היתרונות העיקריים של גישה זו הם:
- הגדרה דינמית – תמיכה במושגים כמו הגדרות שנגזרות מ-MCCMNC, לדוגמה, מפעילי רשתות וירטואליות לנייד (MVNO) או צירוף לקוח לשירותים נוספים.
- תמיכה במכשירים שנמכרים בכל ערוץ – לדוגמה, כשמורידים אפליקציה מחנות אפליקציות אפשר לקבוע באופן אוטומטי את ההגדרות הנכונות לטלפון פתוח.
- אבטחה – ההרשאה לספק את ההגדרה הזו ניתנת רק לאפליקציות שחתומות על ידי הספק.
- Defined API – בעבר ההגדרה הזו שמורה בעיקר בשכבות-על פני XML פנימיות בתוך המסגרת, ולא דרך API ציבורי. ממשק ה-API להגדרות הספק ב-Android 6.0 הוא ציבורי ומוגדר היטב.
איך זה עובד
טעינת התצורה
הגדרת הספק שסופקת על ידי התכונה הזו היא קבוצה של צמדי מפתח/ערך שמשתנים התנהגויות שונות שקשורות לטלפון בפלטפורמה.
קבוצת הערכים למכשיר מסוים נקבעת באמצעות שאילתות על הרכיבים הבאים לפי הסדר:
- האפליקציה של הספק (אופציונלי, אבל זהו המיקום המומלץ להגדרות נוספות, מעבר למה שקיים בפרויקט קוד פתוח של Android (AOSP))
- אפליקציית התצורה של הפלטפורמה, בחבילה עם קובץ האימג' של המערכת
- ערכי ברירת המחדל, בתוך הקוד, שמקבילים להתנהגות שקודמת ל-Android 6.0
אפליקציית ההגדרות של הפלטפורמה
אפליקציית תצורה גנרית של פלטפורמה מצורפת לקובץ תמונת המערכת. האפליקציה הזו יכולה לספק ערכים לכל משתנה שאפליקציית הספק הרגילה לא מספקת. אפליקציית ההגדרות של הפלטפורמה נמצאת (ב-Android 6.0) בכתובת: packages/apps/CarrierConfig
מטרת האפליקציה הזו היא לספק הגדרות מסוימות לכל רשת כשאפליקציית הספק לא מותקנת. ספקי הסלולר או יצרני הציוד המקורי (OEM) צריכים לבצע בה שינויים מינימליים בתמונות שלהם. במקום זאת, הספקים צריכים לספק אפליקציה נפרדת של הספק להתאמה אישית של הספק, כדי לאפשר הפצת עדכונים דרך דרכים כמו חנויות אפליקציות.
איך ניתנות הרשאות לאפליקציה של ספק הסלולר
אפליקציית הספק הרלוונטית חייבת להיות חתומה על ידי אותו אישור שנמצא בכרטיס ה-SIM, כפי שמתואר במאמר הרשאות של ספק UICC.
איזה מידע מועבר לאפליקציית הספק
אפליקציית הספק מקבלת את הערכים הבאים, שמאפשרים לה לקבל החלטה דינמית לגבי הערכים שיש להחזיר:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- מזהה הספק
למידע נוסף על שילוב מזהי ספקי סלולר, ראו שילוב מזהי ספקי סלולר באמצעות CarrierConfig.
מתי מתרחשת טעינת תצורת הספק
היצירה של רשימת צמדי המפתח/ערך מתרחשת:
- כשכרטיס ה-SIM נטען (הפעלה או החלפה חמה של כרטיס SIM)
- כשאפליקציית הספק מפעילה טעינה מחדש באופן ידני
- מתי אפליקציית הספק מתעדכנת
פרטים נוספים זמינים במסמך העזרה של
android.service.carrier.CarrierService#onLoadConfig()
.
שימוש בתצורה
כשמגדירים את התצורה, המערכת משתמשת בערכים שמופיעים בה כדי להגדיר ערכים שונים של הגדרות המערכת, כולל:
- הגדרות טלפוניה פנימית ב-framework
- ערכי הגדרה שמוחזרים על ידי ה-SDK, לדוגמה ב-SmsManager
- הגדרות אפליקציה, כמו ערכי החיבור של VVM במרכז החיוג
מפתחות תצורה
רשימת המפתחות מוגדרת כחלק מ-SDK הציבורי ב-android.telephony.CarrierConfigManager
, ואי אפשר לשנות אותה באותה רמת API. בטבלה הבאה מופיע סיכום של המפתחות.
פיתוח האפליקציה
יצירת האפליקציה
האפליקציה צריכה לטרגט לרמת API של Android 6.0 (23).
צריך להצהיר על מחלקה שמחליפה את android.service.carrier.CarrierService
- משנים את
onLoadConfig
כדי להחזיר את הערכים שרוצים לספק על סמך האובייקטservice.carrier.CarrierIdentifier
שהוענק. - מוסיפים לוגיקה לקריאה ל-
notifyConfigChangedForSubId
בתרחישים שבהם ההגדרות של הספק עשויות להשתנות לאורך זמן (לדוגמה, כשהמשתמש מוסיף שירותים נוספים לחשבון שלו).
הנה דוגמה:
public class SampleCarrierConfigService extends CarrierService { private static final String TAG = "SampleCarrierConfigService"; public SampleCarrierConfigService() { Log.d(TAG, "Service created"); } @Override public PersistableBundle onLoadConfig(CarrierIdentifier id) { Log.d(TAG, "Config being fetched"); PersistableBundle config = new PersistableBundle(); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL, true); config.putBoolean( CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false); config.putInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT, 6); // Check CarrierIdentifier and add more config if needed… return config; } }
למידע נוסף, עיינו במסמכי העזרה של android.service.carrier.CarrierService
.
נותנים שם לכיתה במניפסט
דוגמה:
<service android:name=".SampleCarrierConfigService" android:label="@string/service_name" android:permission="android.permission.BIND_CARRIER_SERVICES"> <intent-filter> <action android:name="android.service.carrier.CarrierService"/></intent-filter> </service>
חותמים על האפליקציה באמצעות אותו אישור ב-SIM
הדרישות מפורטות במאמר הרשאות של ספק UICC.
הוספת APNs באמצעות אפליקציית ספק
כדי להוסיף APN באופן פרוגרמטי מאפליקציית ספק (לדוגמה, במהלך הפעלת ה-SIM), משתמשים ב-
ContentResolver
APIs כדי להוסיף פריטים של APN לספק תוכן שמזוהה לפי ה-URI
android.provider.Telephony.Carriers.CONTENT_URI
.
למידע נוסף על מבנה הטבלה של URI התוכן, ראו
Telephony.Carriers
.
למידע נוסף, ראו APN ו-CarrierConfig.
בדיקת האפליקציה
אחרי שבניתם את אפליקציית ההגדרות, תוכלו לבדוק את הקוד באמצעות:
- כרטיס SIM שמכיל חתימה תקפה של אישור
- מכשיר עם Android מגרסה 6.0 ואילך, למשל מכשיר Android
הגדרת היכולות של שירות הספק
ב-Android, היכולות של שירות הספק מתארות אם במכשיר יש תמיכה בשירותי קול, העברת הודעות ונתונים. ספקי הסלולר יכולים לציין את יכולות שירות הספק במכשיר ברמת המכשיר וברמת המינוי (Android מגרסה 15 ואילך).
יכולות שירות ברמת המכשיר
יכולות שירות ברמת המכשיר מוגדרות בשלב הייצור של המכשיר (לא ניתן לשנות אותן אחרי הייצור). ספקים יכולים לציין יכולות ברמת המכשיר באמצעות השינויים הבאים של משאבי המערכת:
אפליקציות יכולות לשלוח שאילתות לגבי יכולות השירות ברמת המכשיר באמצעות ממשקי ה-API הבאים:
יכולות השירות ברמת המינוי
במכשירים עם Android מגרסה 15 ואילך, הספקים יכולים לציין את יכולות השירות של המכשיר ברמת המינוי. כדי לציין את יכולות השירות ברמת המינוי, משתמשים ב-API
CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY
. לדוגמה, כדי לציין למינוי שהוא נתונים בלבד, מגדירים את הערך בתור
SubscriptionManager#SERVICE_CAPABILITY_DATA
.
אפליקציות (אפליקציות מערכת שהועלו מראש ואפליקציות של צד שלישי) יכולות לשלוח שאילתות לגבי היכולות של שירות הספק עבור מינוי ספציפי באמצעות השיטה
SubscriptionInfo.getServiceCapabilities()
. כך מפתחי האפליקציות יכולים להתאים אישית את חוויית המשתמש של האפליקציות על סמך היכולות הזמינות במינוי. לדוגמה, מפתחי אפליקציות יכולים לוודא שאפליקציית החייגן לא מאפשרת לבצע שיחות אם למשתמש יש מינוי לנתונים בלבד.
ממשקי API של יכולות שירות שהוצאו משימוש
החל מגרסה 15 של Android, מערכת Android מספקת יכולות שירות ברמת המכשיר וברמת המינוי. בעקבות השינוי הזה, שמות ממשקי ה-API הקיימים של היכולות ברמת המכשיר שונו כדי לשפר את הקריאוּת שלהם. בטבלה הבאה מפורטים ממשקי ה-API שהוצאו משימוש וממשקי ה-API ששינו את השם והוצגו ב-Android 15:
הוצא משימוש (Android 14 ומטה) | מקבילה (Android 15 ואילך) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |