Android 6.0 以上版本含有特殊權限功能 應用程式,以便為平台提供電信業者專屬的設定。這個 功能 (以 UICC 電信業者權限為準) Android 5.1 (Lollipop MR1) 中導入的電信業者 會移出靜態設定重疊, 電信業者和原始設備製造商 (OEM) 可以動態提供電信業者設定 透過已定義的介面連至平台
開發人員可以在系統映像檔中預先載入經正確簽署的電信業者應用程式 自動安裝或透過應用程式商店手動安裝。應用程式 用於提供設定 包括:
- 漫遊/非漫遊網路
- 視覺化語音信箱
- 簡訊/多媒體訊息網路設定
- VoLTE/IMS 設定
要傳回哪些值完全由電信業者應用程式決定 也可以根據傳遞至應用程式的詳細資訊來動態調整 平台。
這種方法的主要優點如下:
- 動態設定 - 支援下列概念: 非 MCCMNC 衍生設定,例如 行動虛擬網路業者 (MVNO) 或客戶選擇使用其他服務。
- 支援透過任何管道販售的裝置:例如 它能自動設定正確的 從應用程式商店下載應用程式
- 安全性:提供這項設定的權限為 只會提供給由電信業者簽署的應用程式。
- Defined API - 先前已儲存這項設定 多數為架構的內部 XML 疊加層,而非透過公開檔案 也能使用 Google Cloud CLI 或 Compute Engine APIAndroid 6.0 中的電信業者設定 API 為公開且定義明確。
運作方式
載入設定
這項功能提供的電信業者設定是一組鍵/值組合 可改變平台上的各種電話相關行為。
特定裝置的一組值是由查詢 依序新增下列元件:
- 電信業者應用程式 (此為選用步驟,但我們建議採用) Android Open 以外的其他設定的位置 來源專案 (AOSP)
- 隨附系統映像檔的平台設定應用程式
- 預設值,透過硬式編碼加入架構 (相當於 至 Android 6.0 版本)
平台設定應用程式
系統映像檔已隨附通用平台設定應用程式。這個應用程式可提供
值。平台設定
應用程式位於 Android 6.0 版本:packages/apps/CarrierConfig
這個應用程式的目的是為電信業者提供部分聯播網設定 應用程式尚未安裝,且電信業者/原始設備製造商 (OEM) 應該只對應用程式進行小幅變更 自己的圖片電信業者應另行提供電信業者的應用程式 ,以便透過這種方式發布更新 如同應用程式商店
如何授予電信業者應用程式的權限
該電信業者應用程式的簽署憑證必須和您在以下網站取得的憑證相同 參閱「UICC 電信業者權限」一文中的 SIM 卡。
哪些資訊會傳遞給電信業者應用程式
電信業者應用程式提供下列值,使應用程式能產生 要傳回哪些值:
- MCC
- MNC
- SPN
- IMSI
- GID1
- GID2
- 電信業者 ID
如要進一步瞭解如何整合電信業者 ID,請參閱 整合電信業者 ID 與 CarrierConfig。
載入電信業者設定時
鍵/值組合清單的結構如下:
- SIM 卡載入後 (開機或 SIM 卡熱交換)
- 電信業者應用程式手動觸發重新載入作業
- 電信業者應用程式更新時
請參閱
android.service.carrier.CarrierService#onLoadConfig()
參考。
使用設定
建立設定時,會使用設定中包含的值。 以設置各種系統設定值,包括:
- 內部架構電話設定
- SDK 傳回的設定值,例如 SmsManager
- 應用程式設定,例如 Dialer 中的 VVM 連線值
設定鍵
金鑰清單在 android.telephony.CarrierConfigManager
中定義為公用 SDK 的一部分
也無法在相同的 API 級別中變更如需金鑰的摘要,請參閱下表。
建構應用程式
建立應用程式
您的應用程式必須指定 Android 6.0 API 級別 (23)。
宣告覆寫 android.service.carrier.CarrierService 的類別
- 覆寫
onLoadConfig
以傳回想傳回的值 根據service.carrier.CarrierIdentifier
物件 成功。 - 新增在情境中呼叫
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 電信業者權限以瞭解 Google Cloud 就是最佳選擇
使用電信業者應用程式新增 APN
如何透過電信業者應用程式以程式輔助方式新增 APN (例如 SIM 卡執行期間)
啟用)、使用
用於將 APN 項目新增至內容供應器的 ContentResolver
API
透過 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
也能使用 Google Cloud CLI 或
Compute Engine API舉例來說,如要將訂閱項目設為僅限資料,請將值設為
SubscriptionManager#SERVICE_CAPABILITY_DATA
。
應用程式 (預先載入的系統應用程式和第三方應用程式) 可以查詢電信業者
透過 Deployment 資訊清單
SubscriptionInfo.getServiceCapabilities()
方法。如此一來,應用程式開發人員就能根據
可用的功能舉例來說,應用程式開發人員可以
請只在使用者使用 Android 裝置時,
僅有數據的訂閱。
已淘汰的服務功能 API
從 Android 15 開始,Android 提供裝置層級與 訂閱層級的服務功能這項異動生效後,現有裝置層級 重新命名功能 API 以提升可讀性下表為 Android 15 中引入的已淘汰 API 和重新命名的 API:
已淘汰 (Android 14 以下版本) | 對等 (Android 15 以上版本) |
---|---|
TelephonyManager.isVoiceCapable() |
TelephonyManager.isDeviceVoiceCapable() |
TelephonyManager.isSmsCapable() |
TelephonyManager.isDeviceSmsCapable() |