Android双卡场景下如何通过Broadcast Receiver检测SIM卡状态变更
Android双卡SIM状态变更检测的Broadcast Receiver配置
关于中的Action
静态注册时,你仍然可以使用android.intent.action.SIM_STATE_CHANGED作为action,对应的Manifest配置如下:
<receiver android:name=".SIMStateChangeReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.SIM_STATE_CHANGED"/> </intent-filter> </receiver>
但需要注意:Android 12(API 31)及以上系统中,静态注册的该广播接收器无法接收到SIM状态变更通知,必须改为动态注册才能正常工作。
完整实现方案
- 添加权限
在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Android 13及以上若需获取SIM卡号信息,还需额外申请READ_PHONE_NUMBERS权限,所有危险权限都需要动态申请。
- 动态注册广播接收器
在Activity或Service中动态注册接收器,示例代码:
private SIMStateChangeReceiver simStateReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 动态注册广播 simStateReceiver = new SIMStateChangeReceiver(); IntentFilter filter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED); registerReceiver(simStateReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 销毁时注销接收器,避免内存泄漏 if (simStateReceiver != null) { unregisterReceiver(simStateReceiver); } }
- 实现广播接收器(双卡适配)
在接收器中通过TelephonyManager获取双卡的状态信息:
public class SIMStateChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); List<SubscriptionInfo> subscriptionList = telephonyManager.getSubscriptionInfoList(); if (subscriptionList != null) { for (SubscriptionInfo info : subscriptionList) { int slotIndex = info.getSimSlotIndex(); int simState = telephonyManager.getSimState(info.getSubscriptionId()); String stateDesc; switch (simState) { case TelephonyManager.SIM_STATE_READY: stateDesc = "激活就绪"; break; case TelephonyManager.SIM_STATE_ABSENT: stateDesc = "未插入/已停用"; break; case TelephonyManager.SIM_STATE_PIN_REQUIRED: stateDesc = "需PIN码解锁"; break; case TelephonyManager.SIM_STATE_PUK_REQUIRED: stateDesc = "需PUK码解锁"; break; default: stateDesc = "未知状态"; } Log.d("SIM_STATUS", "卡槽" + (slotIndex + 1) + ": " + stateDesc); } } } } }
补充说明
- 除了
SIM_STATE_CHANGED,你也可以监听android.telephony.action.SUBSCRIPTION_PHONE_STATE_CHANGED,该广播会在SIM订阅状态变化时触发,同样需要动态注册。 - 动态注册时,务必在组件销毁时注销接收器,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Saral
相关产品推荐
相关产品推荐

