תצורת ספק

בגרסה 6.0 ואילך של Android יש יכולת לאפליקציות בעלות הרשאות להעביר לפלטפורמה הגדרות ספציפיות לספק. הפונקציונליות הזו, שמבוססת על הרשאות הספק של UICC שהוצגו ב-Android 5.1‏ (Lollipop MR1), מאפשרת להעביר את הגדרות הספק מהשכבות העליונות של ההגדרות הסטטיות, ומאפשרת לספקים וליצרני ציוד מקורי לספק באופן דינמי הגדרות של ספק לפלטפורמה דרך ממשק מוגדר.

אפליקציה של ספק שתחתום בצורה תקינה יכולה להיות טעונה מראש בתמונת המערכת, מותקנת באופן אוטומטי או מותקנת באופן ידני דרך חנות אפליקציות. הפלטפורמה שולחת לאפליקציה שאילתה כדי לקבל הגדרות, כולל:

  • רשתות נדידה/לא נדידה
  • דואר קולי ויזואלי
  • הגדרות הרשת של SMS/MMS
  • הגדרות VoLTE/IMS

ההחלטה לגבי הערכים להחזרתם היא אך ורק של אפליקציית הספק, והיא יכולה להיות דינמית על סמך מידע מפורט שמוענק לאפליקציה דרך הפלטפורמה.

היתרונות המרכזיים של הגישה הזו הם:

  • הגדרה דינמית – תמיכה במושגים כמו הגדרה שלא נגזרת מ-MCCMNC, למשל, ספקי רשתות וירטואליות לנייד (MVNO) או הסכמה של לקוחות לשירותים נוספים.
  • תמיכה במכשירים שנמכרים בכל ערוץ – לדוגמה, אפשר להוריד אפליקציה מחנות אפליקציות כדי להגדיר באופן אוטומטי את ההגדרות המתאימות בטלפון שנמכר בשוק הפתוח.
  • אבטחה – ההרשאה לספק את ההגדרה הזו ניתנת רק לאפליקציות שחתומות על ידי הספק.
  • Defined API – בעבר ההגדרה הזו שמורה בעיקר בשכבות-על פני XML פנימיות בתוך המסגרת, ולא דרך API ציבורי. ממשק ה-API להגדרת ספק ב-Android 6.0 הוא ציבורי ומוגדר היטב.

איך זה עובד

טעינת התצורה

הגדרת הספק שסופקת על ידי התכונה הזו היא קבוצה של צמדי מפתח/ערך שמשתנים התנהגויות שונות שקשורות לטלפון בפלטפורמה.

קבוצת הערכים של מכשיר מסוים נקבעת על ידי שליחת שאילתות לרכיבים הבאים לפי הסדר:

  1. אפליקציית הספק (האפשרות הזו היא אופציונלית, אבל היא המיקום המומלץ להגדרות נוספות מעבר לאלה שקיימות ב-Android Open Source Project‏ (AOSP))
  2. אפליקציית ההגדרות של הפלטפורמה שכלולה בתמונה של המערכת
  3. ערכי ברירת מחדל, שמוגדרים מראש במסגרת (זהה להתנהגות שלפני 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().

שימוש בתצורה

כשהתצורה נוצרת, המערכת משתמשת בערכים שמופיעים בה כדי להגדיר ערכים שונים של הגדרות המערכת, כולל:

  • הגדרות טלפוניה של מסגרת פנימית
  • ערכי הגדרה שמוחזרים על ידי ה-SDK, לדוגמה ב-SmsManager
  • הגדרות אפליקציה, כמו ערכי החיבור של VVM במרכז החיוג

מפתחות תצורה

רשימת המפתחות מוגדרת כחלק מ-SDK הציבורי ב-android.telephony.CarrierConfigManager, ואי אפשר לשנות אותה באותה רמת API. בטבלה הבאה מופיע סיכום של המפתחות.

פיתוח האפליקציה

יצירת האפליקציה

האפליקציה שלכם צריכה לטרגט לרמת API ‏23 של Android 6.0.

מגדירים כיתה שמבטלת את הגדרת ברירת המחדל של android.service.carrier.CarrierService

  1. משנים את onLoadConfig כדי להחזיר את הערכים שרוצים לספק על סמך האובייקט service.carrier.CarrierIdentifier שהוענק.
  2. מוסיפים לוגיקה לקריאה ל-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()