You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测被叫用户是否处于通话状态?含Broadcast Receivers实现咨询

检测通话状态的实现方案

一、检测本地设备的通话状态(Broadcast Receiver + TelephonyManager)

如果是要检测当前设备(自己的手机)是否处于通话状态,Android系统提供了直接的API和广播机制来实现:

1. 用Broadcast Receiver监听通话状态变化

你可以注册一个广播接收器,监听系统发出的android.intent.action.PHONE_STATE广播——这个广播会在设备通话状态切换(空闲、响铃、通话中)时触发。

示例代码(Kotlin):

class CallStateReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val telephonyManager = context?.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        when (telephonyManager.callState) {
            TelephonyManager.CALL_STATE_IDLE -> {
                // 设备无通话,处于空闲状态
            }
            TelephonyManager.CALL_STATE_RINGING -> {
                // 有来电正在响铃
            }
            TelephonyManager.CALL_STATE_OFFHOOK -> {
                // 设备正在通话中
            }
        }
    }
}

注册方式推荐动态注册(避免后台不必要的监听),或者在Manifest中声明:

<receiver android:name=".CallStateReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

注意:需要申请READ_PHONE_STATE权限,Android 10及以上还需额外申请READ_CALL_LOG权限,记得在运行时动态申请这些权限。

2. 单次查询当前通话状态

如果不需要实时监听,只是偶尔检查设备是否在通话,可以直接通过TelephonyManager查询:

val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
val isInCall = telephonyManager.callState == TelephonyManager.CALL_STATE_OFFHOOK

二、检测远程对方的通话状态(类似WhatsApp的功能)

你提到的WhatsApp提示“对方正在通话”的功能,本质是对方设备将自身通话状态同步到服务器,当你发起呼叫时,服务器把对方的实时状态返回给你。这种场景的实现逻辑分为两步:

1. 对方设备实时上报状态

让对方的设备通过上面的本地检测方法,监听自身通话状态变化;一旦状态切换(比如进入通话、结束通话),就通过你的APP后端服务器同步这个状态。

2. 发起呼叫前查询服务器

当你发起呼叫请求时,先向服务器查询目标用户的当前通话状态,拿到结果后再在APP中展示对应的提示(比如“对方正在通话中”)。

有没有更简便的方式?遗憾的是,Android系统没有开放直接获取远程设备通话状态的API(涉及用户隐私),所以服务器中转是这类应用的通用方案,也是最可靠的实现方式。

三、补充注意事项

  • 后台监听稳定性:Android 8.0及以上对后台广播接收器有严格限制,如果需要在后台持续监听通话状态,建议用Foreground Service配合PhoneStateListener,这样更不容易被系统回收。
    示例代码(使用PhoneStateListener):
    val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    val phoneStateListener = object : PhoneStateListener() {
        override fun onCallStateChanged(state: Int, phoneNumber: String?) {
            super.onCallStateChanged(state, phoneNumber)
            // 处理状态变化逻辑
        }
    }
    telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE)
    

内容的提问来源于stack exchange,提问作者user2386226

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:14:56