TelecomManager.endCall()方法已废弃,求拒接原生电话的替代方案
替代TelecomManager.endCall()的方案
从Android 10(API 29)开始,TelecomManager.endCall()被标记为过时,官方推荐使用带callId参数的endCall(String callId)方法。以下是具体实现步骤和代码:
1. 申请必要权限
在AndroidManifest.xml中声明所需权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <!-- Android 13及以上需添加,确保通话状态监听正常工作 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
这些属于危险权限,需要在运行时动态申请。
2. 监听通话状态获取callId
要结束通话必须先获取当前通话的callId,通过注册CallStateListener监听状态变化:
private String mCurrentCallId; // 初始化TelecomManager并注册监听 TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE); if (telecomManager != null) { telecomManager.addCallStateListener(new TelecomManager.CallStateListener() { @Override public void onCallStateChanged(int state, String callId) { // 电话响铃或接通时保存callId if (state == TelecomManager.CALL_STATE_RINGING || state == TelecomManager.CALL_STATE_OFFHOOK) { mCurrentCallId = callId; } else if (state == TelecomManager.CALL_STATE_IDLE) { // 通话结束后清空callId mCurrentCallId = null; } } }, Executors.newSingleThreadExecutor()); }
3. 调用新方法结束通话
根据系统版本选择对应实现:
public void endCurrentCall() { TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE); if (telecomManager == null || mCurrentCallId == null) { return; } try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // Android 10及以上使用带callId的endCall方法 telecomManager.endCall(mCurrentCallId); } else { // 兼容Android 9及以下,使用过时方法 telecomManager.endCall(); } } catch (SecurityException e) { // 处理权限不足异常,比如提示用户授权 e.printStackTrace(); } }
注意事项
- 必须确保应用已获得所有必要的运行时权限,否则会抛出
SecurityException。 - 如果是系统签名的内部测试应用,可获得更高权限,简化权限申请流程。
内容的提问来源于stack exchange,提问作者jfalexvijay
相关产品推荐
相关产品推荐

