如何在Android来电、去电场景下通过BroadcastReceiver获取手机号码?
实现方案
一、前置权限配置
首先要在AndroidManifest.xml中添加必要权限和广播注册:
<!-- 基础通话状态权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- Android 9及以上获取通话号码需要该权限 --> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <!-- Android 8及以下获取去电号码需要该权限 --> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <receiver android:name=".MyCallReceiver"> <intent-filter> <!-- 监听通话状态变化(来电相关) --> <action android:name="android.intent.action.PHONE_STATE" /> <!-- 监听去电广播 --> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver>
注意:以上权限均为Android危险权限,Android 6.0(API 23)及以上版本需要在代码中动态申请,用户授权后才能正常获取号码。
二、代码调整
修改后的广播接收类代码如下:
public class MyCallReceiver extends BroadcastReceiver { // 存储获取到的手机号,避免状态切换时intent无号码参数 private String currentPhoneNumber; @Override public void onReceive(Context context , Intent intent) { String action = intent.getAction(); // 处理去电场景 if (Intent.ACTION_NEW_OUTGOING_CALL.equals(action)) { currentPhoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); // 这里可以直接使用去电号码 return; } // 处理来电/通话状态变化场景 if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) { String callState = intent.getStringExtra(TelephonyManager.EXTRA_STATE); if (TelephonyManager.EXTRA_STATE_RINGING.equals(callState)) { // 来电响铃时获取来电号码 currentPhoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); // 这里可以使用来电号码 } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(callState)) { // 通话接通,currentPhoneNumber就是当前通话的号码 } else if (TelephonyManager.EXTRA_STATE_IDLE.equals(callState)) { // 通话挂断,使用完可以置空避免复用旧号码 currentPhoneNumber = null; } } } }
三、注意事项
- 部分国内定制ROM对通话广播做了限制,可能出现无法接收广播或获取号码为空的情况,需要针对对应ROM做适配。
- Android 10及以上版本禁止后台应用获取通话相关敏感信息,建议将权限申请逻辑放在前台页面触发。
内容的提问来源于stack exchange,提问作者dotcom
相关产品推荐
相关产品推荐

