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

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状态变更通知,必须改为动态注册才能正常工作。


完整实现方案

  1. 添加权限
    在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

Android 13及以上若需获取SIM卡号信息,还需额外申请READ_PHONE_NUMBERS权限,所有危险权限都需要动态申请。

  1. 动态注册广播接收器
    在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);
    }
}
  1. 实现广播接收器(双卡适配)
    在接收器中通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:48:09