对于运行 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 测试。