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

如何在InCallService中处理呼叫等待?断开等待呼叫失败求助

解决InCallService中无法断开等待呼叫的问题

看起来你已经在自定义来电界面的开发上取得了不少进展,但在处理第二个等待呼叫时遇到了call.disconnect()不生效的问题对吧?我来帮你分析下可能的原因,以及具体的解决办法。

问题根源分析

你当前的代码依赖全局变量constants.CALL_IN_PROGRESS来判断是否有正在进行的通话,但这个变量的状态可能和实际通话状态不同步;另外,等待状态的呼叫可能还没进入可直接调用disconnect()的状态,或者你需要先确认呼叫的可操作权限。

具体解决步骤

1. 改用可靠的通话状态判断方式

不要依赖全局变量,直接通过getCalls()方法获取当前所有活跃呼叫,判断是否存在正在进行的通话(STATE_ACTIVE状态),这样能避免状态不同步的问题。

2. 先检查呼叫的可操作权限

在调用disconnect()之前,先通过call.can(Call.CAPABILITY_DISCONNECT)确认当前呼叫是否支持断开操作;如果不支持,对于来电类型的等待呼叫,可以尝试调用reject()方法拒绝。

3. 修正onCallAdded和onCallRemoved逻辑

下面是修改后的完整代码示例:

public class CallService extends InCallService {
    private BroadcastReceiver headsetReceiver = null;

    @Override
    public void onCallAdded(Call call) {
        super.onCallAdded(call);
        Log.d("bbbbbb", "inside");
        
        // 检查当前是否存在活跃的通话
        boolean hasActiveCall = false;
        for (Call activeCall : getCalls()) {
            if (activeCall != call && activeCall.getDetails().getState() == Call.Details.STATE_ACTIVE) {
                hasActiveCall = true;
                break;
            }
        }

        if (!hasActiveCall) {
            new OngoingCall().setCall(call);
            CallActivity.start(this, call);
            constants.CALL_IN_PROGRESS = true;
        } else {
            // 优先尝试断开呼叫
            if (call.can(Call.CAPABILITY_DISCONNECT)) {
                call.disconnect();
                Log.d("bbbbbb", "已断开等待呼叫: " + call.getDetails().getHandle());
            } 
            // 如果无法断开,尝试拒绝来电(针对呼入的等待呼叫)
            else if (call.can(Call.CAPABILITY_REJECT)) {
                call.reject(false, null);
                Log.d("bbbbbb", "已拒绝等待来电");
            } else {
                Log.d("bbbbbb", "当前呼叫无法断开或拒绝");
            }
        }
    }

    @Override
    public void onCallRemoved(Call call) {
        super.onCallRemoved(call);
        handy_methods hm = new handy_methods(this);
        String saved_number = hm.read_sharedpreference("incomingNumber");
        String latestCallNumber = call.getDetails().getHandle().toString().replace("tel:%2B", "+");
        
        // 确认被移除的是当前正在进行的通话时,重置状态
        Call ongoingCall = new OngoingCall().getCall();
        if (ongoingCall != null && ongoingCall.equals(call)) {
            new OngoingCall().setCall(null);
            constants.CALL_IN_PROGRESS = false;
            Log.d("aaaaaa", "s5: 正在进行的通话已结束");
        }
    }
}

额外注意事项

  • 确保你的OngoingCall单例类能正确维护当前通话实例,避免状态混乱;
  • 部分设备上等待呼叫的状态可能是Call.Details.STATE_RINGING或STATE_HOLDING,如果上述代码效果不佳,可以尝试调整状态判断逻辑;
  • 确认已在AndroidManifest中正确注册InCallService,并申请了READ_PHONE_STATE、CALL_PHONE等必要权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:07