系統業者設定

Android 6.0 以上版本提供功能,可讓具備特殊權限的應用程式向平台提供電信業者專屬設定。這項功能是以 Android 5.1 (Lollipop MR1) 推出的 UICC 業者權限為基礎,可將業者設定從靜態設定疊加層移開,並讓業者和原始設備製造商 (OEM) 透過定義的介面,動態向平台提供業者設定。

正確簽署的電信業者應用程式可以預先載入系統映像檔、自動安裝,或透過應用程式商店手動安裝。平台會查詢應用程式,以提供設定的設定,包括:

  • 漫遊/非漫遊網路
  • 視覺化語音信箱
  • 簡訊/多媒體訊息網路設定
  • VoLTE/IMS 設定

要傳回哪些值完全取決於電信業者應用程式,而且可以根據透過平台傳遞至應用程式的詳細資訊動態決定。

這種做法的主要優點如下:

  • 動態設定 - 支援非 MCCMNC 衍生設定等概念,例如行動虛擬網路業者 (MVNO) 或客戶選擇加入額外服務。
  • 支援透過任何管道銷售的裝置 - 舉例來說,只要從應用程式商店下載應用程式,即可自動為開放市場手機設定正確的設定。
  • 安全性 - 只有電信業者簽署的應用程式,才能提供這項設定。
  • 定義的 API - 先前這項設定大多儲存在架構內的內部 XML 疊加層,而非透過公開 API。Android 6.0 中的電信業者設定 API 是公開且定義完善的 API。

運作方式

載入設定

這項功能提供的電信業者設定是一組鍵/值組合,可變更平台中各種與電話相關的行為。

特定裝置的值集是依序查詢下列元件而決定:

  1. 電信業者應用程式 (這是選用項目,但建議您在此處進行 Android 開放原始碼計畫 (AOSP) 以外的額外設定)
  2. 系統映像檔隨附的平台設定應用程式
  3. 架構中硬式編碼的預設值 (相當於 Android 6.0 之前的行為)

平台設定應用程式

系統映像檔會隨附一般平台設定應用程式。這個應用程式可為一般貨運公司應用程式無法提供的任何變數提供值。平台設定應用程式 (Android 6.0) 位於:packages/apps/CarrierConfig

這個應用程式的用途是在未安裝電信業者應用程式時,提供部分網路設定,電信業者/原始設備製造商應只在自己的映像檔中進行最少的變更。電信業者應提供獨立的電信業者應用程式,供電信業者自訂,並透過應用程式商店等管道發布更新。

如何授予電信業者應用程式特殊權限

UICC 業者權限所述,相關電信業者應用程式必須使用 SIM 卡上的憑證簽署。

傳送給電信業者應用程式的資訊

系統會提供下列值給貨運公司應用程式,讓應用程式動態決定要傳回哪些值:

  • MCC
  • MNC
  • SPN
  • IMSI
  • GID1
  • GID2
  • 電信業者 ID

如要進一步瞭解如何整合電信業者 ID,請參閱「 整合電信業者 ID 與 CarrierConfig」。

載入電信業者設定時

系統會在下列情況建立鍵/值組合清單:

  • 載入 SIM 卡時 (開機或熱插拔 SIM 卡)
  • 當電信業者應用程式手動觸發重新載入時
  • 電信業者應用程式更新時

詳情請參閱 android.service.carrier.CarrierService#onLoadConfig() 參考資料。

使用設定

建構設定時,系統會使用其中的值設定各種系統設定值,包括:

  • 內部架構電話設定
  • SDK 傳回的設定值,例如 SmsManager 中的設定值
  • 應用程式設定,例如撥號程式中的 VVM 連線值

設定金鑰

金鑰清單是公開 SDK 的一部分,定義於 android.telephony.CarrierConfigManager ,且無法在相同 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 裝置

設定電信業者服務功能

在 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 更容易閱讀。下表列出 Android 15 中已淘汰和重新命名的 API:

已淘汰 (Android 14 以下版本) 同等版本 (Android 15 以上版本)
TelephonyManager.isVoiceCapable() TelephonyManager.isDeviceVoiceCapable()
TelephonyManager.isSmsCapable() TelephonyManager.isDeviceSmsCapable()