營運商配置

Android 6.0 及更高版本包含特權應用程式向平台提供特定於運營商的配置的功能。此功能基於 Android 5.1 (Lollipop MR1) 中引入的UICC 運營商特權,允許運營商配置從靜態配置覆蓋中移出,並使運營商和 OEM 能夠透過定義的介面動態向平台提供運營商配置。

正確簽署的運營商應用程式可以預先載入到系統映像中、自動安裝或透過應用程式商店手動安裝。平台查詢應用程式以提供設定配置,包括:

  • 漫遊/非漫遊網絡
  • 可視語音信箱
  • 簡訊/彩信網路設置
  • VoLTE/IMS 配置

傳回哪些值完全取決於運營商應用程序,並且可以根據透過平台傳遞到應用程式的詳細資訊進行動態確定。

這種方法的主要優點是:

  • 動態配置- 支援非 MCCMNC 衍生配置等概念,例如行動虛擬網路營運商 (MVNO) 或客戶選擇加入額外服務。
  • 支援透過任何管道銷售的設備- 例如,可以透過從應用程式商店下載應用程式來自動配置開放市場手機的正確設定。
  • 安全性- 僅向運營商簽署的應用程式授予提供此配置的權限。
  • 定義的 API - 先前此配置主要儲存在框架內的內部 XML 覆蓋中,而不是透過公共 API。 Android 6.0 中的電信業者配置 API 是公開的且定義良好。

怎麼運作的

載入配置

此功能提供的營運商配置是一組鍵值對,可變更平台中各種與電話相關的行為。

特定設備的值集是透過依序查詢以下組件來決定的:

  1. 運營商應用程式(這是可選的,但建議在 Android 開源專案 (AOSP) 之外進行其他配置)
  2. 與系統映像捆綁在一起的平台配置應用程式
  3. 預設值,硬編碼到框架中(相當於 Android 6.0 之前的行為)

平台配置應用程式

通用平台配置應用程式與系統映像捆綁在一起。此應用程式可以為常規運營商應用程式不提供的任何變數提供值。平台配置應用程式可以在以下位置找到(在 Android 6.0 中): packages/apps/CarrierConfig

此應用程式的目的是在未安裝運營商應用程式時提供一些針對每個網路的配置,並且運營商/OEM 應該在自己的映像中對其進行最小程度的更改。相反,運營商應該提供單獨的運營商應用程式以進行運營商定制,從而允許透過應用程式商店等途徑分發更新。

如何向運營商應用程式授予權限

相關運營商應用程式必須使用 SIM 卡上的相同憑證進行簽名,如UICC 運營商特權中所述。

哪些資訊會傳遞給運營商應用程式

運營商應用程式提供了以下值,使其能夠動態決定傳回哪些值:

  • 中冶集團
  • 跨國企業
  • SPN
  • 國際行動用戶識別碼
  • GID1
  • GID2
  • 營運商ID

有關整合運營商 ID 的更多信息,請參閱將運營商 ID 與 CarrierConfig 整合

載入運營商配置時發生

鍵值對列表的建構發生:

  • 當 SIM 卡載入時(啟動或 SIM 熱插拔)
  • 當運營商應用手動觸發重新加載時
  • 當運營商應用程式更新時

有關更多詳細信息,請參閱android.service.carrier.CarrierService#onLoadConfig()參考。

使用配置

建置配置時,其中包含的值用於設定係統配置的各種值,包括:

  • 內部框架電話設置
  • SDK傳回的配置值,例如SmsManager中的配置值
  • 應用程式設置,例如撥號器中的 VVM 連接值

配置鍵

鍵列表在android.telephony.CarrierConfigManager中定義為公共 SDK 的一部分,並且不能在同一 API 層級內更改。請參閱下表以了解按鍵摘要。

建立應用程式

創建應用程式

您的應用程式必須面向 Android 6.0 API 等級 (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 設備