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

Android SMS Receiver无法接收短信广播的问题排查求助

解决Android SMS Receiver无法接收短信广播的问题

我帮你梳理了当前配置和代码里的几个关键问题,按照下面的步骤逐一修复应该就能解决问题:

1. 修正广播接收器的exported属性

你在Manifest里把接收器的android:exported设为了false,但系统发送的短信广播来自外部(系统进程),只有将exported设为true,接收器才能接收外部应用/系统发送的广播。修改后的接收器配置:

<receiver android:name=".ExampleBroadcastReceiver2" 
          android:enabled="true" 
          android:exported="true" 
          android:permission="android.permission.BROADCAST_SMS">

2. 补充动态权限申请(Android 6.0+)

READ_SMS和RECEIVE_SMS属于危险权限,仅在Manifest声明是不够的,必须在代码中动态请求。在你的主Activity中添加以下代码:

private static final int REQUEST_SMS_PERMISSIONS = 100;
private String[] smsPermissions = {Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 检查并申请权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, smsPermissions, REQUEST_SMS_PERMISSIONS);
    }
}

// 处理权限申请结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_SMS_PERMISSIONS) {
        boolean allGranted = true;
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                allGranted = false;
                break;
            }
        }
        if (!allGranted) {
            // 权限被拒绝,提示用户开启权限
            Toast.makeText(this, "需要开启短信权限才能接收短信", Toast.LENGTH_SHORT).show();
        }
    }
}

3. 精简Intent Filter(保留必要的Action)

你的Intent Filter里添加了大量无关的Action,接收普通短信只需要保留android.provider.Telephony.SMS_RECEIVED即可,多余的Action会增加不必要的匹配逻辑。修改后的Intent Filter:

<intent-filter android:priority="999">
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>

注:priority="999"是合理的,确保你的接收器优先于其他应用处理短信广播,但不要超过1000(系统限制的最大值)。

4. 确保接收器代码正确实现

检查你的ExampleBroadcastReceiver2类,确保onReceive方法正确处理短信广播,示例代码如下:

public class ExampleBroadcastReceiver2 extends BroadcastReceiver {
    private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (SMS_RECEIVED_ACTION.equals(intent.getAction())) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus != null) {
                    for (Object pdu : pdus) {
                        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
                        String sender = smsMessage.getDisplayOriginatingAddress();
                        String messageContent = smsMessage.getMessageBody();
                        // 打印日志验证是否收到短信
                        Log.d("SMSReceiver", "收到来自[" + sender + "]的短信:" + messageContent);
                    }
                }
            }
        }
    }
}

5. 测试注意事项

  • 使用真实设备测试,部分模拟器的短信广播机制可能存在问题;
  • 发送测试短信后,查看Logcat中SMSReceiver标签的日志,确认是否收到广播;
  • 如果是Android 12及以上版本,确保应用安装后已授予短信权限(设置→应用→你的应用→权限→短信)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:06:25