ב-Android 6.0 ואילך יש אפשרות לאפליקציות עם הרשאות מיוחדות לספק לפלטפורמה הגדרה ספציפית לספק הסלולר. הפונקציונליות הזו, שמבוססת על הרשאות ספק UICC שהוצגו ב-Android 5.1 (Lollipop MR1), מאפשרת להעביר את הגדרות הספק מהשכבות הסטטיות של ההגדרות, ומעניקה לספקים וליצרני ציוד מקורי (OEM) את היכולת לספק באופן דינמי הגדרות ספק לפלטפורמה באמצעות ממשק מוגדר.
אפליקציה של ספק שחתמה כראוי יכולה להיות טעונה מראש בקובץ אימג' של המערכת, מותקנת באופן אוטומטי או מותקנת באופן ידני דרך חנות אפליקציות. הפלטפורמה שולחת לאפליקציה שאילתה כדי לקבל הגדרות, כולל:
- רשתות בנדידה/לא בנדידה
- דואר קולי ויזואלי
- הגדרות רשת של SMS/MMS
- הגדרות VoLTE/IMS
ההחלטה אילו ערכים להחזיר נתונה לחלוטין לאפליקציית הספק, והיא יכולה להיות דינמית על סמך מידע מפורט שמועבר לאפליקציה דרך הפלטפורמה.
היתרונות המרכזיים של הגישה הזו הם:
- הגדרה דינמית – תמיכה במושגים כמו הגדרה שלא נגזרת מ-MCCMNC, למשל מפעילים של רשתות וירטואליות לנייד (MVNO) או לקוחות שמצטרפים לשירותים נוספים.
- תמיכה במכשירים שנמכרים בכל ערוץ – לדוגמה, אפשר להוריד אפליקציה מחנות אפליקציות כדי להגדיר באופן אוטומטי טלפון שנמכר בשוק הפתוח עם ההגדרות הנכונות.
- אבטחה – ההרשאה לספק את ההגדרה הזו ניתנת רק לאפליקציות שנחתמו על ידי הספק.
- API מוגדר – בעבר ההגדרה הזו אוחסנה בעיקר בשכבות-על פנימיות של XML בתוך ה-framework ולא באמצעות API ציבורי. ממשק ה-API של הגדרות הספק ב-Android 6.0 הוא ציבורי ומוגדר היטב.
איך זה עובד
טעינת ההגדרות
ההגדרה של הספק שמועברת על ידי התכונה הזו היא קבוצה של צמדי מפתח/ערך שמשנים התנהגויות שונות שקשורות לטלפוניה בפלטפורמה.
קבוצת הערכים של מכשיר מסוים נקבעת על ידי שליחת שאילתה לרכיבים הבאים לפי הסדר:
- אפליקציית הספק (אופציונלית, אבל מומלצת למי שרוצה להגדיר הגדרות נוספות מעבר למה שקיים בפרויקט Android Open Source Project (AOSP))
- אפליקציית הגדרת הפלטפורמה שצורפה לקובץ האימג' של המערכת
- ערכי ברירת מחדל, שמוגדרים מראש במסגרת (שווה להתנהגות לפני Android 6.0)
אפליקציית הגדרת הפלטפורמה
אפליקציית הגדרות פלטפורמה גנרית מצורפת לקובץ אימג' של המערכת. האפליקציה הזו יכולה לספק ערכים לכל המשתנים שאפליקציית הספק הרגילה לא מספקת. אפליקציית התצורה של הפלטפורמה נמצאת (ב-Android 6.0) במיקום: packages/apps/CarrierConfig
מטרת האפליקציה היא לספק הגדרה מסוימת לכל רשת כשלא מותקנת אפליקציית ספק, וספקים או יצרני ציוד מקורי צריכים לבצע בה שינויים מינימליים בלבד בתמונות שלהם. במקום זאת, ספקי הסלולר צריכים לספק אפליקציה נפרדת של ספק הסלולר להתאמה אישית של ספק הסלולר, כדי לאפשר הפצה של עדכונים דרך ערוצים כמו חנויות אפליקציות.
איך מעניקים הרשאה לאפליקציה של ספק סלולר
אפליקציית הספק הרלוונטית צריכה להיות חתומה באותו אישור שמופיע בכרטיס ה-SIM, כפי שמתואר במאמר UICC Carrier Privileges.
איזה מידע מועבר לאפליקציה של ספק הסלולר
אפליקציית הספק מקבלת את הערכים הבאים, שמאפשרים לה לקבל החלטה דינמית לגבי הערכים להחזרה:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- מזהה הספק
מידע נוסף על שילוב מזהי חברות תובלה זמין במאמר בנושא שילוב מזהי חברות תובלה עם CarrierConfig.
מתי מתבצעת טעינה של הגדרות הספק
רשימת צמדי מפתח/ערך נוצרת:
- כשה-SIM נטען (אתחול או החלפה חמה של ה-SIM)
- כשאפליקציית הספק מפעילה טעינה מחדש באופן ידני
- כשמעדכנים את אפליקציית הספק
פרטים נוספים מופיעים במאמר בנושא
android.service.carrier.CarrierService#onLoadConfig().
שימוש בהגדרה
כשיוצרים את ההגדרה, הערכים שכלולים בה משמשים להגדרת ערכים שונים של הגדרת המערכת, כולל:
- הגדרות טלפוניה פנימיות של מסגרת
- ערכי הגדרה שמוחזרים על ידי ה-SDK, לדוגמה, ב-SmsManager
- הגדרות של אפליקציות, כמו ערכי החיבור של תא קולי חזותי בחייגן
מפתחות הגדרה
רשימת המפתחות מוגדרת כחלק מה-SDK הציבורי ב-android.telephony.CarrierConfigManager, ואי אפשר לשנות אותה באותה רמת API. בטבלה הבאה מופיע סיכום של המקשים.
פיתוח האפליקציה
יצירת האפליקציה
האפליקציה שלך חייבת לטרגט לרמת API 23 של Android 6.0.
הצהרה על מחלקה שמבטלת את ברירת המחדל של 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.
הוספת APN באמצעות אפליקציה של ספק
כדי להוסיף APN באופן פרוגרמטי מאפליקציית ספק (לדוגמה, במהלך הפעלת כרטיס SIM), משתמשים בממשקי ה-API של
ContentResolver כדי להוסיף פריטי 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 של יכולות שירות שהוצאו משימוש
החל מ-Android 15, מערכת Android מספקת יכולות שירות ברמת המכשיר וברמת המינוי. בגלל השינוי הזה, שמות ממשקי ה-API הקיימים של היכולות ברמת המכשיר שונו כדי לשפר את הקריאות. בטבלה הבאה מפורטים ממשקי ה-API שהוצאו משימוש וממשקי ה-API ששמם שונה, שהוצגו ב-Android 15:
| הוצא משימוש (Android מגרסה 14 ומטה) | מקביל (Android מגרסה 15 ואילך) |
|---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |