תצורת הספק

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

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

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

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

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

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

איך זה עובד

טוען את התצורה

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

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

  1. אפליקציית הספק (זה אופציונלי, אבל זה המיקום המומלץ לתצורה נוספת מעבר למה שקיים בפרויקט הקוד הפתוח של Android (AOSP))
  2. אפליקציית תצורת הפלטפורמה המצורפת עם תמונת המערכת
  3. ערכי ברירת מחדל, מקודדים קשיחים לתוך המסגרת (מקביל להתנהגות לפני אנדרואיד 6.0)

אפליקציית תצורת הפלטפורמה

אפליקציית תצורת פלטפורמה גנרית מצורפת לתמונת המערכת. אפליקציה זו יכולה לספק ערכים עבור כל משתנים שאפליקציית הספק הרגילה אינה מספקת. ניתן למצוא את אפליקציית תצורת הפלטפורמה (באנדרואיד 6.0) ב: packages/apps/CarrierConfig

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

כיצד ניתנת הרשאה לאפליקציית ספק

יש לחתום על אפליקציית הספק המדוברת עם אותו אישור שנמצא בכרטיס ה-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 של 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 עבור הדרישות.

הוספת APNs עם אפליקציית ספק

כדי להוסיף APNs באופן פרוגרמטי מאפליקציית הספק (לדוגמה, במהלך הפעלת SIM), השתמש בממשקי ContentResolver API כדי להוסיף פריטי APN לספק תוכן המזוהה על ידי URI android.provider.Telephony.Carriers.CONTENT_URI . למידע נוסף על מבנה הטבלה עבור URI התוכן, ראה Telephony.Carriers .

למידע נוסף, ראה APN ו-CarrierConfig .

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

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

  • SIM המכיל חתימת תעודה תקפה
  • מכשיר עם אנדרואיד 6.0 ואילך, למשל מכשיר אנדרואיד