网域选择服务

对于搭载 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 权限的进程才能绑定到相应的应用。这样可以防止恶意应用绑定到该服务,因为框架只会向系统应用授予这项权限。

此外,该服务还必须指定具有 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 测试。