You need to enable JavaScript to run this app. 如何通过BoardCastReceiver识别哪张SIM卡收到了短信?
优惠活动
大模型
产品
解决方案
定价
更多

如何通过BoardCastReceiver识别哪张SIM卡收到了短信?

监听短信时判断接收SIM卡的实现方法

前置说明

你提到的BoardCastReceiver拼写有误,正确类名是BroadcastReceiver。
该实现需要区分安卓系统版本适配,安卓5.1(API 22)开始有官方公开API实现该需求,更低版本无通用方案,需要针对厂商定制ROM适配。

前置权限配置

需要提前申请两个权限:

  • 短信接收权限:RECEIVE_SMS,安卓6.0及以上需要动态申请
  • 读取电话状态权限:READ_PHONE_STATE,安卓6.0及以上需要动态申请

API 22及以上版本实现

安卓5.1之后,系统在短信广播的Intent中内置了接收短信的SIM卡订阅ID,直接读取即可关联到对应卡槽:

  1. 从onReceive传入的Intent中读取subscription字段,获取SIM卡订阅ID
  2. 用SubscriptionManager查询该订阅ID对应的卡槽信息
    示例代码:
@Override
public void onReceive(Context context, Intent intent) {
    if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
        // 读取订阅ID,默认返回-1代表读取失败
        int subId = intent.getIntExtra("subscription", -1);
        if (subId == -1) {
            return;
        }
        SubscriptionManager subManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
        SubscriptionInfo simInfo = subManager.getActiveSubscriptionInfo(subId);
        if (simInfo != null) {
            // simSlot为0代表卡1,为1代表卡2,多卡设备以此类推
            int simSlot = simInfo.getSimSlotIndex();
            // 可选:获取SIM卡对应的运营商名称、绑定号码等信息
            String carrierName = simInfo.getCarrierName().toString();
            String simNumber = simInfo.getNumber();
        }
    }
}

低版本兼容说明

安卓5.1以下没有公开API支持该需求,不同厂商会在广播Intent中自定义额外字段存储SIM卡槽信息,常见的字段键包括simId、slot、sim,需要针对不同厂商的ROM做单独适配,没有通用实现方案。

注意事项

  • 部分定制ROM会修改系统默认的subscription字段值,出现取值异常时需要针对对应ROM做适配
  • 安卓13(API 33)及以上版本需要额外适配短信相关的权限变更
  • 若getSimSlotIndex()返回-1,代表对应订阅ID无效,一般是权限未授予或对应卡槽无有效SIM卡

内容的提问来源于stack exchange,提问作者Mohamed Azzouz Kada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 10:00:04