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

