如何通过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,直接读取即可关联到对应卡槽:
- 从
onReceive传入的Intent中读取subscription字段,获取SIM卡订阅ID - 用
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
相关产品推荐
相关产品推荐

