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

安卓应用前后台均无法识别来去电且Toast未弹出 代码问题排查问询

问题汇总
  • 字符串比较逻辑错误:Java中String类型内容对比需使用equals()方法,现有代码使用==对比引用地址,永远返回false,导致所有状态判断都不生效。
  • 呼出广播处理逻辑缺失:注册了android.intent.action.NEW_OUTGOING_CALL呼出广播,但现有onReceive逻辑只读取TelephonyManager.EXTRA_STATE参数,该参数仅存在于来电状态广播中,呼出广播不会携带,因此呼出场景无法触发判断。
  • 权限申请不全:
    1. 未声明和申请呼出电话所需的权限:低于Android 10(API 29)版本需要android.permission.PROCESS_OUTGOING_CALLS权限,Android 10及以上版本需要android.permission.READ_CALL_LOG权限才能获取呼出电话状态,现有代码仅申请了READ_PHONE_STATE。
    2. 若目标版本为Android 13及以上,还需额外申请android.permission.READ_PHONE_NUMBERS权限。
  • 高版本系统后台Toast限制:Android 11(API 30)及以上版本禁止后台应用弹出自定义Toast,因此后台场景下即使广播触发也无法看到提示。
修复方案

1. 调整Manifest权限声明

添加对应权限:

<!-- 基础电话状态权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Android 10以下呼出电话权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" android:maxSdkVersion="28" />
<!-- Android 10及以上获取通话记录(含呼出状态)权限 -->
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<!-- Android 13及以上获取电话号码权限 -->
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />

2. 补全动态权限申请逻辑

// 权限列表按目标版本调整
String[] permissions;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    permissions = new String[]{
        Manifest.permission.READ_PHONE_STATE,
        Manifest.permission.READ_CALL_LOG,
        Manifest.permission.READ_PHONE_NUMBERS
    };
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    permissions = new String[]{
        Manifest.permission.READ_PHONE_STATE,
        Manifest.permission.READ_CALL_LOG
    };
} else {
    permissions = new String[]{
        Manifest.permission.READ_PHONE_STATE,
        Manifest.permission.PROCESS_OUTGOING_CALLS
    };
}

// 校验所有权限是否已授予
boolean allGranted = true;
for (String permission : permissions) {
    if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
        allGranted = false;
        break;
    }
}
if (!allGranted) {
    ActivityCompat.requestPermissions(this, permissions, 369);
}

3. 修复广播接收器逻辑

public class CallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // 处理呼出广播
        if (Intent.ACTION_NEW_OUTGOING_CALL.equals(action)) {
            showToastMsg(context, "正在呼出电话...");
            return;
        }
        // 处理来电状态广播
        if (TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(action)) {
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) {
                showToastMsg(context, "通话已接通...");
            } else if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {
                showToastMsg(context, "通话已结束...");
            } else if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
                showToastMsg(context, "有新的来电...");
            }
        }
    }

    private void showToastMsg(Context c, String msg) {
        Toast.makeText(c, msg, Toast.LENGTH_LONG).show();
    }
}

4. 适配后台提示需求

若需要后台场景也能看到提示,可替换Toast为通知栏通知,需额外申请POST_NOTIFICATIONS权限(Android 13及以上)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:18:03