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

