網域選取服務

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

domain-selection-architecture

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

範例和來源

Android 已於 TelephonyDomainSelectionService 提供 Android 開放原始碼計畫中的網域選取功能參考實作內容。如需 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 權限的程序才能繫結至應用程式。這可防止惡意應用程式繫結至服務,因為只有系統應用程式才能由架構授予權限。

服務也必須使用 android.telephony.DomainSelectionService 動作指定 intent-filter 元素。這可讓架構找到 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 測試。