11月末,Reddit 用户 KitchenPicture 5849 发帖称:搭载 Android 11 的 Pixel 手机阻止他拨打 911,当时他的祖母中风需要呼叫救护车,但打了 911 报警电话后“手机一响就卡住了,除了点击后台运行的紧急电话的应用程序之外,什么也做不了。”
此现象还可以复现,帖子热度膨胀后,Reddit 用户重现了该问题,他们并表示在发起呼叫后五分钟,紧急服务部门没有任何回应,也没有证据表明手机呼叫了 911 ——设备上的电话记录和运营商(Verizon ) 电话记录都显示为空。
;
12 月 8 日,谷歌正面回应了此问题,表示“该问题由 Microsoft Teams 应用程序和底层 Android 操作系统之间的意外交互引起,我们将很快修复此问题,将在 1 月 4 日向 Android 生态系统提供 Android 平台更新”。
让人不安和困惑的是,像 Microsoft Teams 这样的第三方应用程序,竟然能够干扰像紧急拨号如此重要的服务。几乎所有国家的法律都要求运营商将紧急呼叫路由到附近的紧急服务站点,这样即使移动设备没有装 SIM 卡,也能拨打紧急求助电话。
也就是说:任何情况下都不应该阻止手机紧急拨号。
问题来源:PhoneAccounts
随后,外媒 medium 的 Mishaal Rahma 对谷歌所说的“Microsoft Teams 和 底层 Android 的意外交互”进行了详细的研究,发现事情出在 Android 底层的 PhoneAccounts 实例上,具有通话功能的 Android 应用程序都会构建 PhoneAccount 实例,比如 Microsoft Teams 应用,它使用 Skype 后端进行语音通话,但它无法处理紧急呼叫,因此才会出现文章开头那种无法拨打 911 的问题。
但如果单纯按照这个逻辑,那么所有装了 Microsoft Teams 的 Android 手机都不能拨打 911 了,但事实并非如此,通常 Android 系统会通过“是否支持紧急呼叫”等标签对 PhoneAccounts 列表进行排序,选出优先级最高的 PhoneAccounts 实例并执行。
接下来问题的谜底就揭晓了,Microsoft Teams 应用出现 PhoneAccount 实例过度注册的错误。每当手机安装了 Microsoft Teams 应用程序但尚未登录时,该应用程序的每次冷启动都会创建另一个 PhoneAccount 实例。过多的 PhoneAccount 实例进行排序,导致 Android 的 sortSimPhoneAccountsforEmergency
紧急呼叫优先级 排序 方法出现整数上溢/下溢错误,从而选择了错误的应用来进行紧急呼叫。
后续
- 12月 10日,微软推出 Teams 应用程序的 1416/1.0.0.2021194504 版。此版本解决了生成过多重复 PhoneAccounts 的问题,还会在首次启动时调用 TelecomManager 的
clearPhoneAccounts
方法,来清除之前创建的所有PhoneAccounts。 - 热心网友 @linuxct 开发了一个简单的开源应用程序,该程序可以列出设备中所有的 PhoneAccounts ,并评估是否有应用程序存在过度注册 PhoneAccounts 的问题 ,目前可在 GitHub 下载。