Android CALL_STATE_OFFHOOK 很长时间后收到

Android CALL_STATE_OFFHOOK received after a very long time

我有一个通话录音应用程序,可以对来自专用 BroadcastReceiver 的通话状态变化做出反应。
BroadcastReceiver 在我的清单中正确注册,连同 PROCESS_OUTGOING_CALLSREAD_PHONE_STATE 权限。

我的问题是,出于某种原因,在某些呼叫中,我在呼叫结束几分钟后收到 CALL_STATE_OFFHOOK 状态广播。
似乎广播以某种方式卡住了,然后在一段时间后触发。自 CALL_STATE_OFFHOOK 广播后大约 X 时间后收到 'CALL_STATE_IDLE' 后续广播,其中 X 是实际调用所花费的时间。
我的日志验证之前的 onReceive 调用没有挂起进程或 BroadcastReceiver。

造成这种行为的原因是什么?

更新:
我发现这种情况发生在我打开或关闭 Wi-Fi 并开始通话时距离 Wi-Fi 变化相对较近。
这是问题的原因还是实际问题的症状?

在Android系统中,广播是在内部处理的。

有时,由于系统加载/重启/高运行时间,广播接收器有时间接收一些意图

解决方法是,将标志 FLAG_RECEIVER_FOREGROUND 添加到意图发送广播

intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

在问题场景中,这将比以前加快广播传送速度

事实证明这是 android 发送的广播中的错误(或者是一些故障接收器)。调查 log cat 显示一些系统接收器确实按时收到广播,而其他系统接收器(在我之前)在很长时间后才收到。
只要 Wi-Fi 状态在通话开始期间发生变化,就会经常发生这种情况。

我所做的是创建一个 ITelephony 代理(归功于 End call in android programmatically)并监控其状态。


感谢各位帮手:)