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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:45:05