如何在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
相关产品推荐
相关产品推荐

