網域選取服務

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

網域選取服務的架構圖,顯示與 Android 平台和供應商實作項目的互動

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

範例和來源

Android 在 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 中執行 Compatibility Test Suite (CTS) 測試。