如何在Android设备中检测SIM卡是否更换?
Android SIM卡更换检测实现方案
方法一:对比SIM卡唯一标识(ICCID/IMSI)
核心逻辑是首次获取并存储SIM卡的唯一标识,后续每次启动或定时检查时,对比当前标识与存储的标识,不一致则判定为SIM卡已更换。
- 获取SIM标识
通过TelephonyManager获取ICCID(集成电路卡识别码)或IMSI(国际移动用户识别码),两者均为SIM卡的唯一标识:
val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager // 需提前申请READ_PHONE_STATE权限 val iccid = telephonyManager.simSerialNumber val imsi = telephonyManager.subscriberId
- 存储与对比逻辑
将首次获取的标识存入SharedPreferences,后续启动时取出对比:
val prefs = getSharedPreferences("SIM_INFO", Context.MODE_PRIVATE) val savedIccid = prefs.getString("SAVED_ICCID", null) if (savedIccid == null) { // 首次启动,存储当前ICCID prefs.edit().putString("SAVED_ICCID", iccid).apply() } else { if (savedIccid != iccid && iccid != null) { // SIM卡已更换,执行自定义业务逻辑 handleSimChange() // 更新存储的ICCID prefs.edit().putString("SAVED_ICCID", iccid).apply() } }
方法二:监听SIM状态变化广播
Android系统会在SIM卡状态变更时发送android.intent.action.SIM_STATE_CHANGED广播,通过注册广播接收器可实时监听这一事件:
- 动态注册广播接收器
(推荐动态注册,避免静态注册的系统限制)
val simStateReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { val simState = intent?.getStringExtra(TelephonyManager.EXTRA_SIM_STATE) when (simState) { TelephonyManager.SIM_STATE_READY -> { // SIM卡就绪,在此处执行标识对比逻辑 checkSimChange() } TelephonyManager.SIM_STATE_ABSENT -> { // SIM卡已移除,可标记状态或执行清理逻辑 } } } } // 注册广播 registerReceiver(simStateReceiver, IntentFilter("android.intent.action.SIM_STATE_CHANGED"))
关键注意事项
- 权限要求:Android 6.0及以上需动态申请
READ_PHONE_STATE;Android 10+中subscriberId(IMSI)可能返回空,优先使用simSerialNumber(ICCID); - 双卡设备处理:通过
TelephonyManager.getSubscriptionInfoList()获取多卡槽的SIM信息,逐一对比; - 持久化检测:若应用被杀死,动态广播接收器会失效,可结合WorkManager定时执行检查任务,或监听开机广播(
android.intent.action.BOOT_COMPLETED)在设备重启后重新检测。
内容的提问来源于stack exchange,提问作者Chakori Chaturvedi
相关产品推荐
相关产品推荐

