תצורת ספק

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

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

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

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

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

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

איך זה עובד

טעינת ההגדרה

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

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

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

  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.

הוספת 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()