對於搭載 Android 15 以上版本的裝置,您可以使用 DomainSelectionService
系統 API,在 IMS 服務和透過電路交換網路的舊版服務之間實作網域選取功能。DomainSelectionService
是 Android 平台與供應商提供的網域選取實作項目之間的明確介面。透過這個介面,供應商實作項目可向平台提供信號資訊,例如撥出電話和傳送簡訊的網域,以及網路掃描中的網路類型偏好設定。
圖 1. 網域選取功能架構圖
範例和來源
Android 在 AOSP 的 TelephonyDomainSelectionService
提供網域選取功能的參考實作方式。如需 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
權限的程序可以繫結至應用程式。這可防止惡意應用程式繫結至服務,因為只有系統應用程式可以透過架構獲得權限。
服務也必須指定 intent-filter
元素和 android.telephony.DomainSelectionService
動作。架構會藉此尋找 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 測試。