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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:36:03