תצורת ספק

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

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

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

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

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

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

איך זה עובד

טעינת ההגדרה

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

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

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

  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 הפעלה), להשתמש ContentResolver ממשקי API להוספת פריטי APN לספק תוכן זוהה על ידי ה-URI android.provider.Telephony.Carriers.CONTENT_URI למידע נוסף על מבנה הטבלה עבור ה-URI של התוכן, ניתן לעיין במאמר Telephony.Carriers

מידע נוסף זמין במאמר הבא: APN ו-CarrierConfig.

בדיקת האפליקציה

אחרי שיוצרים את אפליקציית ההגדרות, אפשר לבדוק את הקוד עם:

  • כרטיס SIM שמכיל חתימת אישור חוקית
  • מכשיר עם Android 6.0 ואילך, למשל מכשיר Android

הגדרת יכולות של שירות ספק

ב-Android, היכולות של השירות של הספק מתארות אם ההודעות הקוליות, העברת ההודעות, ושירותי הנתונים והקוד נתמכים במכשיר. ספקים יכולים לציין את הספק יכולות שירות למכשיר ברמת המכשיר ובמינוי רמה (Android 15 ומעלה).

יכולות שירות ברמת המכשיר

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

האפליקציות יכולות לשלוח שאילתות על יכולות השירות ברמת המכשיר באמצעות ממשקי API:

יכולות שירות ברמת המינוי

במכשירים עם Android מגרסה 15 ואילך, הספקים יכולים לציין את יכולות השירות של המכשיר ברמת המינוי. כדי לציין שירות ברמת המינוי יכולות, השתמשו CarrierConfigManager.KEY_CELLULAR_SERVICE_CAPABILITIES_INT_ARRAY API. לדוגמה, כדי לציין שמינוי הוא נתונים בלבד, צריך להגדיר את הערך כ- 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()