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

Android SDK 31下监听通话结束:替代TelephonyManager.listen的方案

使用registerTelephonyCallback监听通话结束的实现方案

1. 声明必要权限

首先在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />

注意Android 13及以上版本,READ_PHONE_STATE和CALL_PHONE都需要动态申请。

2. 实现自定义TelephonyCallback

创建子类继承TelephonyCallback并实现CallStateListener接口,重写通话状态监听方法:

import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;

public class CallStateCallback extends TelephonyCallback implements TelephonyCallback.CallStateListener {
    @Override
    public void onCallStateChanged(int state) {
        switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                // 通话结束,设备回到空闲状态
                onCallEnded();
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                // 通话接通(拨出或来电接听)
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                // 来电响铃
                break;
        }
    }

    private void onCallEnded() {
        // 在这里处理通话结束后的业务逻辑,比如记录通话时长、更新UI等
    }
}

3. 注册与注销回调

在Activity/Service中完成权限校验、回调注册,务必在生命周期结束时注销回调避免内存泄漏:

import android.Manifest;
import android.content.pm.PackageManager;
import android.telephony.TelephonyManager;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

public class MainActivity extends AppCompatActivity {
    private TelephonyManager telephonyManager;
    private CallStateCallback callStateCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        telephonyManager = getSystemService(TelephonyManager.class);
        callStateCallback = new CallStateCallback();

        checkPermissionsAndRegisterCallback();
    }

    private void checkPermissionsAndRegisterCallback() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE}, 101);
            return;
        }
        // 注册回调,getMainExecutor()确保回调在主线程执行
        telephonyManager.registerTelephonyCallback(getMainExecutor(), callStateCallback);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 101) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                checkPermissionsAndRegisterCallback();
            } else {
                // 权限被拒绝,无法监听通话状态
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销回调
        if (telephonyManager != null && callStateCallback != null) {
            telephonyManager.unregisterTelephonyCallback(callStateCallback);
        }
    }
}

关键注意点

  • 必须确保READ_PHONE_STATE权限已授予,否则注册回调会失败。
  • 通话结束的判定逻辑:当状态从CALL_STATE_OFFHOOK切换到CALL_STATE_IDLE时,即为通话结束。
  • 如果在Service中使用,要对应在onDestroy()或onTaskRemoved()中注销回调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:37:35