对于搭载 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
权限的进程才能绑定到相应的应用。这样可以防止恶意应用绑定到该服务,因为框架只会向系统应用授予这项权限。
此外,该服务还必须指定具有 android.telephony.DomainSelectionService
操作的 intent-filter
元素。这样,框架就可以找到 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 测试。