תצורת ספק

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

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

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

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

היתרונות העיקריים של גישה זו הם:

  • הגדרה דינמית – תמיכה במושגים כמו הגדרה שלא נגזרת מ-MCCMNC, למשל, ספקי רשתות וירטואליות לנייד (MVNO) או הסכמה של לקוחות לשירותים נוספים.
  • תמיכה במכשירים שנמכרים בכל ערוץ – לדוגמה, אפשר להוריד אפליקציה מחנות אפליקציות כדי להגדיר באופן אוטומטי את ההגדרות המתאימות בטלפון שנמכר בשוק הפתוח.
  • אבטחה – ההרשאה לספק את ההגדרה הזו ניתנת רק לאפליקציות שחתומות על ידי הספק.
  • Configured 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.

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