網域選取服務

對於搭載 Android 15 以上版本的裝置,您可以使用 DomainSelectionService 系統 API,在 IMS 服務和透過電路交換網路的舊版服務之間實作網域選取功能。DomainSelectionService 是 Android 平台與供應商提供的網域選取實作項目之間的明確介面。透過這個介面,供應商實作項目可向平台提供信號資訊,例如撥出電話和傳送簡訊的網域,以及網路掃描中的網路類型偏好設定。

domain-selection-architecture

圖 1. 網域選取功能架構圖

範例和來源

Android 在 AOSP 的 TelephonyDomainSelectionService 提供網域選取功能的參考實作方式。如需 DomainSelectionService API 的詳細文件,請參閱 DomainSelectionService 和 API 中的其他類別。

實作

如要在 Android 裝置上導入網域選取功能,請完成下列步驟:

  1. 建立網域選取應用程式。服務必須在 AndroidManifest.xml 檔案中定義。

  2. 在裝置疊加層中新增設定,讓平台繫結至 DomainSelectionService 實作。

  3. 支援網域選取功能所需的無線電 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 服務,請在裝置疊加層中新增下列設定:

由於 Android 不支援採用第三方可下載 DomainSelectionService 實作方式的應用程式,網域選取應用程式必須是位於 /system_ext/priv-app//product/priv-app/ 資料夾的系統應用程式。架構會驗證實作項目的套件名稱是否與裝置疊加值相符,確保只有受信任的預先安裝應用程式會繫結。

支援無線電 HAL 介面

如要啟用網域選取功能,請支援下列必要無線電 HAL 介面:

  • IRadioNetwork

    void setEmergencyMode(int serial, EmergencyMode emcModeType);
    void triggerEmergencyNetworkScan(int serial,
            EmergencyNetworkScanTrigger request);
    void cancelEmergencyNetworkScan(int serial, boolean resetScan);
    void exitEmergencyMode(int serial);
    
  • IRadioNetworkIndication

    void emergencyNetworkScanResult(RadioIndicationType type,
            EmergencyRegResult result);
    

驗證

如要測試電話架構是否正確回應 DomainSelectionService 介面,請在 DomainSelectionServiceTestOnMockModem 中執行 CTS 測試。