ב-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
- הגדרות של אפליקציות, כמו ערכי החיבור של VVM בחייגן
מפתחות הגדרה
רשימת המפתחות מוגדרת כחלק מה-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() |