Android 6.0 ואילך כולל יכולת של הרשאות כדי לספק לפלטפורמה הגדרות ספציפיות לספק. הזה פונקציונליות על סמך הרשאות הספק ב-UICC הושק ב-Android 5.1 (Lollipop MR1), מותרת הפעלה של הספק להתרחקות משכבות-העל של התצורה הסטטית, ספקים ויצרני ציוד מקורי יכולים לספק באופן דינמי את הגדרות הספק לפלטפורמה דרך ממשק מוגדר.
אם אפליקציית ספק חתומה כראוי, אפשר לטעון מראש בתמונת המערכת, מותקנות באופן אוטומטי או הותקנה באופן ידני דרך חנות אפליקציות. האפליקציה נשלחת שאילתה על ידי הפלטפורמה כדי לספק תצורה של הגדרות כולל:
- רשתות בנדידה או בנדידה
- דואר קולי ויזואלי
- הגדרות רשת של SMS/MMS
- הגדרות VoLTE/IMS
קביעת הערכים שיוחזרו תלויה לחלוטין באפליקציה של חברת התובלה והם יכולים להיות דינמיים על סמך מידע מפורט שמועבר לאפליקציה דרך הפלטפורמה.
היתרונות העיקריים של גישה זו הם:
- הגדרה דינמית – תמיכה במושגים כמו הגדרה נגזרת שאינה MCCMNC, לדוגמה, מפעילי רשתות וירטואליות לניידים (MVNO) או לקוחות שהצטרפו לשירותים נוספים.
- תמיכה במכשירים שנמכרים בכל ערוץ - לדוגמה, אפשר להגדיר לטלפון 'שוק פתוח' באופן אוטומטי על ידי הורדה של אפליקציה מחנות אפליקציות.
- אבטחה - ההרשאה לספק את התצורה הזו היא ניתנים רק לאפליקציות שנחתמו על ידי הספק.
- מגדירים API – ההגדרות האישיות האלה אוחסנו בעבר בעיקר בשכבות-על פנימיות של XML בתוך המסגרת ולא דרך API. ה-API לתצורה של הספק ב-Android 6.0 הוא ציבורי ומוגדר היטב.
איך זה עובד
טעינת ההגדרה
הגדרת הספק שמסופקת על ידי התכונה הזו היא קבוצה של צמדי מפתח-ערך שמשנים התנהגויות שונות שקשורות לטלפוניה בפלטפורמה.
קבוצת הערכים עבור מכשיר מסוים נקבעת באמצעות שליחת שאילתות על הרכיבים הבאים לפי הסדר:
- האפליקציה של הספק (אופציונלי, אבל זו האפשרות המומלצת מיקום לתצורה נוספת מעבר למה שקיים בפונקציה Open של Android פרויקט מקור (AOSP)
- אפליקציית התצורה של הפלטפורמה, בחבילה עם קובץ האימג' של המערכת
- ערכי ברירת מחדל, בתוך הקוד, שמוצבים בתוך המסגרת (שמקבילים להתנהגות הקודמת ל-Android 6.0)
אפליקציית התצורה של הפלטפורמה
אפליקציית תצורה גנרית של פלטפורמה מצורפת לקובץ תמונת המערכת. האפליקציה הזו יכולה לספק
כל משתנה שלא נכלל באפליקציית הספק הרגילה. הגדרת הפלטפורמה
ניתן למצוא את האפליקציה (ב-Android 6.0) ב: packages/apps/CarrierConfig
מטרת האפליקציה הזו היא לספק הגדרות אישיות לכל רשת כאשר ספק האפליקציה לא מותקנת, וספקים/יצרני ציוד מקורי צריכים לבצע בה שינויים מזעריים בלבד בתמונות שלהם. במקום זאת, הספקים צריכים לספק את האפליקציה הנפרדת של הספק לצורך התאמה אישית של ספקים, כדי לאפשר הפצת עדכונים דרך בתור חנויות אפליקציות.
איך מקבלים הרשאה לאפליקציה של ספק
אפליקציית הספק הרלוונטית חייבת להיות חתומה באמצעות אותו אישור שנמצא ב- כרטיס ה-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 בדרישות שלנו.
הוספת נקודות APN עם אפליקציה של ספק
כדי להוסיף נקודות APN באופן פרוגרמטי מאפליקציית ספק (לדוגמה: במהלך כרטיס SIM
הפעלה), להשתמש
ContentResolver
ממשקי API להוספת פריטי APN לספק תוכן
זוהה על ידי ה-URI
android.provider.Telephony.Carriers.CONTENT_URI
למידע נוסף על מבנה הטבלה עבור ה-URI של התוכן, ניתן לעיין במאמר
Telephony.Carriers
מידע נוסף זמין במאמר הבא: APN ו-CarrierConfig.
בדיקת האפליקציה
אחרי שיוצרים את אפליקציית ההגדרות, אפשר לבדוק את הקוד עם:
- כרטיס SIM שמכיל חתימת אישור חוקית
- מכשיר עם Android 6.0 ואילך, למשל מכשיר Android