若是搭載 Android 15 以上版本的裝置,可以使用 DomainSelectionService
系統 API,透過電路切換網路,在 IMS 服務和舊版服務之間實作網域選擇。DomainSelectionService
是 Android 平台與供應商提供的網域選取實作項目之間的明確介面。這個介面可讓供應商實作提供信號資訊,例如在網路掃描中,傳出通話和 SMS 的網域,以及網路類型偏好設定。
圖 1. 網域選取功能的架構圖
範例和來源
Android 已於 TelephonyDomainSelectionService
提供 Android 開放原始碼計畫中的網域選取功能參考實作內容。如需 DomainSelectionService
API 的詳細說明文件,請參閱 DomainSelectionService
和 API 中的其他類別。
實作
如要在 Android 裝置上導入網域選取功能,請按照下列步驟操作:
建立網域選取應用程式。服務必須在
AndroidManifest.xml
檔案中定義。在裝置疊加層中新增設定,讓平台繫結至
DomainSelectionService
實作項目。支援網域選取功能所需的無線電 HAL 介面。
本節將進一步說明這些步驟。
在 AndroidManifest.xml 中新增服務項目
如要讓網域選取應用程式將 DomainSelectionService
服務註冊至架構,請使用下列格式在資訊清單檔案中新增服務項目:
<service
android:name="com.example.domainselection.DomainSelectionService"
android:directBootAware="true"
android:persistent="true"
…
android:permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
…
<intent-filter>
<action android:name="android.telephony.DomainSelectionService"/>
</intent-filter>
…
</service>
AndroidManifest.xml
中的服務定義必須定義下列屬性,網域選取功能才能運作。
directBootAware="true"
:讓服務在使用者解鎖裝置前,由通訊功能進行探索及執行。在使用者解鎖裝置前,服務無法存取裝置加密儲存空間。詳情請參閱「支援直接啟動模式」和「檔案型加密」。persistent="true"
:讓服務持續執行,且不會遭系統終止,以便回收記憶體。只有在應用程式以系統應用程式形式建構時,這項屬性才有效。permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
:確保只有已授予BIND_DOMAIN_SELECTION_SERVICE
權限的程序才能繫結至應用程式。這可防止惡意應用程式繫結至服務,因為只有系統應用程式才能由架構授予權限。
服務也必須使用 android.telephony.DomainSelectionService
動作指定 intent-filter
元素。這可讓架構找到 DomainSelectionService
服務。
在裝置疊加畫面中定義設定
如要讓平台安全地繫結至 DomainSelectionService
服務,請在裝置疊加層中新增下列設定:
config_domain_selection_service_component_name
:DomainSelectionService
服務的元件名稱 (已扁平化的ComponentName
字串)
由於 Android 不支援含有第三方可下載 DomainSelectionService
實作項目的應用程式,網域選取應用程式必須是位於 /system_ext/priv-app/
或 /product/priv-app/
資料夾中的系統應用程式。此架構會驗證實作項目的套件名稱是否與裝置疊加層值相符,以確保只綁定可信任的預先安裝應用程式。
支援無線電 HAL 介面
如要啟用網域選取功能,請支援下列必要的無線電 HAL 介面:
-
void setEmergencyMode(int serial, EmergencyMode emcModeType); void triggerEmergencyNetworkScan(int serial, EmergencyNetworkScanTrigger request); void cancelEmergencyNetworkScan(int serial, boolean resetScan); void exitEmergencyMode(int serial);
-
void emergencyNetworkScanResult(RadioIndicationType type, EmergencyRegResult result);
驗證
如要測試電話服務架構是否能正確回應 DomainSelectionService
介面,請在 DomainSelectionServiceTestOnMockModem
中執行 CTS 測試。