Android Studio开发中如何在主Activity中使用SmsBroadcastReceiver返回的结果
解决步骤
1. 在主Activity中实现广播接收器回调
你提供的SmsBroadcastReceiver是抽象类,只需要在主Activity中实例化并实现onSmsReceived抽象方法,即可直接在回调中拿到短信结果做业务处理:
public class MainActivity extends AppCompatActivity { private SmsBroadcastReceiver smsBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化短信广播接收器 smsBroadcastReceiver = new SmsBroadcastReceiver() { @Override protected void onSmsReceived(SmsMessage smsMessage) { // 此处直接获取短信所有信息,按需求处理即可 String senderPhone = smsMessage.getOriginatingAddress(); // 发件人手机号 String smsContent = smsMessage.getMessageBody(); // 短信正文 long receiveTime = smsMessage.getTimestampMillis(); // 接收时间戳 // 示例:将短信内容更新到页面UI(必须在主线程执行) runOnUiThread(() -> { TextView contentText = findViewById(R.id.tv_sms_show); contentText.setText(String.format("收到来自%s的短信:\n%s", senderPhone, smsContent)); }); } }; // 后续注册广播前先申请运行时权限 requestSmsPermission(); }
2. 动态注册、注销广播接收器
Android 8.0(API 26)及以上系统对Manifest静态注册的隐式广播做了限制,短信广播也在受限列表中,优先推荐动态注册方式:
@Override protected void onResume() { super.onResume(); // 配置广播过滤器 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); // 设置和你Manifest中配置一致的优先级 intentFilter.setPriority(1000); // 注册广播 registerReceiver(smsBroadcastReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); // 页面不可见时注销广播,避免内存泄漏 if (smsBroadcastReceiver != null) { unregisterReceiver(smsBroadcastReceiver); } } }
3. 运行时权限适配
Android 6.0(API 23)及以上系统,短信接收权限属于敏感权限,除了Manifest中声明外,还需要主动申请运行时权限,否则无法收到广播:
private void requestSmsPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, 1001); } }
可选优化:提升广播接收器兼容性
你现有代码中的createFromPdu方法在高版本系统上可以传入format参数适配双卡设备,优化后的onReceive代码如下:
@Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pduObjectList = (Object[]) bundle.get("pdus"); String format = bundle.getString("format"); if (pduObjectList != null) { for (Object pduObject : pduObjectList) { SmsMessage smsMessage; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { smsMessage = SmsMessage.createFromPdu((byte[]) pduObject, format); } else { smsMessage = SmsMessage.createFromPdu((byte[]) pduObject); } onSmsReceived(smsMessage); } } } }
内容的提问来源于stack exchange,提问作者Muhammad Ali
相关产品推荐
相关产品推荐

