根据印度电信部 (DoT) 的要求,自 2017 年 1 月 1 日起,在印度销售的所有移动设备都必须提供紧急按钮。为了满足这些监管要求,Android 包含紧急呼叫功能参考实现,以便在 Android 设备上启用紧急按钮。
此功能在 Android 8.0 及更高版本中默认启用,但必须修补到早期版本的现有版本中。此功能专门针对在印度市场销售的设备,但可以包含在全球销售的所有设备中,因为该功能在印度境外无效。
示例和源代码
紧急呼叫功能在 Android 开源项目 (AOSP) frameworks/base 项目中实现。它在主分支中可用,并且在 Android 8.0 及更高版本中默认启用。
此功能在以下分支和提交中可用。提供此信息是为了方便设备制造商轻松地将必要的更改修补到其现有版本中。想要实施 AOSP 参考紧急呼叫功能的设备制造商可以将适用分支中的提交内容挑选到自己的版本中。
表 1. AOSP 参考紧急呼叫功能的挑选内容
| 分支 | 提交内容 |
|---|---|
| main | e0c3c66 添加了紧急呼叫功能 42a4338 添加了紧急操作字符串的翻译 4df8d64 修复了平板电脑上显示紧急呼叫功能的问题 |
| nougat-dev | e6680d9 添加了紧急呼叫功能 95e1865 添加了紧急操作字符串的翻译 a70bb89 修复了平板电脑上显示紧急呼叫功能的问题 |
| marshmallow-dev | cd22634 添加了紧急呼叫功能 13f51c6 添加了紧急操作字符串的翻译 6531666 修复了平板电脑上显示紧急呼叫功能的问题 |
| lollipop-mr1-dev | 5fbc86b 添加了紧急呼叫功能 1b60879 添加了紧急操作字符串的翻译 d74366f 修复了平板电脑上显示紧急呼叫功能的问题 |
实现
紧急呼叫功能不会更改通过 Android 软件开发工具包 (SDK) 公开的 API。启用和激活后,该功能提供两个触发器,可以发起拨打 112 的紧急呼叫,112 是印度使用的唯一紧急电话号码,也是印度 DoT 法规强制要求的。
可通过以下任一方式发起紧急呼叫:
| 长按紧急呼叫按钮 在锁屏界面上 |
点按紧急呼叫选项 在全局操作菜单中 |
|---|---|
图 1. 锁屏界面上的“紧急呼叫”按钮。 |
图 2. 全球操作菜单中的紧急操作(通过长按电源键访问)。 |
此功能引入了以下内部组件
- EmergencyAffordanceManager
frameworks/base/core/java/com/android/internal/policy/EmergencyAffordanceManager.java
- EmergencyAffordanceService
frameworks/base/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
EmergencyAffordanceManager
EmergencyAffordanceManager 提供了一个内部 API 来使用紧急帮助功能。它提供了用于启动紧急呼叫以及在运行时查询是否应启用该功能的方法。
void performEmergencyCall()。启动紧急呼叫。boolean needsEmergencyAffordance()。确定是否应激活该功能。
可以通过将 EmergencyAffordanceManager.ENABLED 常量更改为 false,在构建时永久禁用该功能。这将导致 needsEmergencyAffordance() 始终返回 false,并阻止 EmergencyAffordanceService 启动。
EmergencyAffordanceService
EmergencyAffordanceService 是一项系统服务,用于监控所有检测到的蜂窝网络的移动国家代码 (MCC) 以及已安装 SIM 卡的 MCC。如果任何已安装的 SIM 卡或检测到的蜂窝网络具有与印度 MCC(404 或 405)之一匹配的 MCC,则该功能将被启用。这意味着即使未插入 SIM 卡,该功能也可能在印度启用。假设即使未安装 SIM 卡,移动网络也允许注册紧急呼叫。该功能将保持启用状态,直到安装非印度 SIM 卡并且检测到的网络均不具有匹配的 MCC。
以下资源和设置会影响紧急帮助功能的行为。如果配置类型是
- 资源,则它是
frameworks/base/core/res/res/values/config.xml中定义的内部资源。 - 设置,则它是存储在系统设置提供程序中的设置。
表 2. 影响紧急帮助功能行为的设置
| 配置类型 | 名称 | 描述 |
|---|---|---|
| 资源 | config_emergency_call_number | 启动紧急呼叫时自动拨打的电话号码。 类型:字符串 默认值:112 |
| 资源 | config_emergency_mcc_codes | 应在其中激活该功能的 MCC 整数数组。 类型:整数数组 默认值:{404,405} |
| 设置 | emergency_affordance_number | 全局设置会覆盖用于紧急帮助的呼叫号码。这仅在可调试构建映像(即,构建类型为 userdebug 或 eng)上有效。这仅用于测试。 类型:字符串 默认值:未设置 |
| 设置 | force_emergency_affordance | 全局设置,无论设备状态如何,是否应显示紧急帮助功能。这仅用于测试。 类型:布尔值(1 或 0) 默认值:未设置 --> 0 |
启用对 112 的紧急呼叫
紧急帮助功能使用紧急拨号器连接呼叫,以便在锁屏处于活动状态时可以连接呼叫。紧急拨号器仅连接到无线接口层 (RIL) 通过系统属性提供的号码列表
ril.ecclist,当未安装 SIM 卡时。ril.ecclistSimSlotNumber,当插入 SIM 卡且SimSlotNumber是默认订阅者的卡槽 ID 时。
使用紧急帮助功能的设备制造商必须确保印度的设备始终在 RIL 中启用 112 作为紧急号码。
验证
在可调试版本上进行测试时,可以使用以下命令更改呼叫的号码
adb shell settings put global emergency_affordance_number NUMBER_TO_CALL
尽管可以在普通用户版本上设置此设置,但它会被忽略。要实际连接呼叫,该号码必须位于 RIL 提供的紧急号码列表中。可以使用从 userdebug 设备上的 root shell 执行的以下命令临时设置此列表
setprop ril.ecclist "$(getprop ril.ecclist),NUMBER_TO_CALL"
以下命令也可用于强制启用紧急帮助功能,即使在未检测到印度移动网络或未插入印度 SIM 卡的情况下也是如此。
adb shell settings put global force_emergency_affordance 1
至少,建议测试以下情况
- 激活后,长按锁屏上的紧急呼叫按钮(图 1)会启动对指定紧急号码的呼叫。
- 激活后,全球操作菜单上的紧急呼叫项将显示,点击它会启动对指定紧急号码的呼叫。
- 在未检测到印度移动网络且安装了非印度 SIM 卡的情况下,该功能未激活。
- 当设备上安装了印度 SIM 卡时,无论检测到的移动网络如何,该功能已激活。
- 在设备上存在印度移动网络的情况下,无论安装了哪些 SIM 卡,该功能已激活。
如果设备支持多张 SIM 卡,则测试应确保 SIM MCC 检测在每个 SIM 卡槽中都能正常工作。紧急帮助功能不受 Android 兼容性约束,因此没有针对它的兼容性测试套件 (CTS) 测试。
常见问题解答
问:紧急号码 112 尚未在印度开通。是否仍应使用它?
112 是印度用作公共安全应答点 (PSAP) 的号码,如集成紧急通信和响应系统 (IECRS) 所定义。在 PSAP 开通之前,所有对 112 的呼叫都将路由到现有的 100 紧急号码(但这由运营商负责,而不是 Android)。
问:三重按下电源按钮等其他触发器呢?
设备制造商可以实现其他触发器。但是,尽管印度电信部批准三重点击硬件电源按钮,但 AOSP 参考实现不支持此触发器,因为一些广泛使用的应用程序(例如,相机应用)使用了包括重复点击电源按钮的电源按钮手势。此类应用可能会干扰紧急拨号器,或者用户可能在尝试触发这些应用中的操作时意外触发紧急按钮。