如何在Android中通过编程方式获取SIM卡类型(eSIM/实体SIM卡)
检测Android设备中的eSIM(嵌入式SIM卡)类型
核心方案:使用EuiccManager
EuiccManager是Android官方提供的eSIM管理API,以下是完整的检测流程:
1. 声明并申请必要权限
在AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Android 6.0(API 23)及以上版本需动态申请权限,因为READ_PHONE_STATE属于危险权限。
2. 检测eSIM状态的代码实现
private static final int REQUEST_READ_PHONE_STATE = 1001; // 初始化权限检查与eSIM检测入口 private void initEsimCheck() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE); } else { checkEsimStatus(); } } // 核心检测逻辑 private void checkEsimStatus() { EuiccManager euiccManager = getSystemService(EuiccManager.class); if (euiccManager == null) { Log.d("ESIM_DETECT", "设备不支持eSIM功能"); return; } if (!euiccManager.isEnabled()) { Log.d("ESIM_DETECT", "eSIM功能未开启"); return; } List<EuiccProfile> profiles = euiccManager.getEuiccProfiles(); if (profiles == null || profiles.isEmpty()) { Log.d("ESIM_DETECT", "无已激活的eSIM卡"); return; } for (EuiccProfile profile : profiles) { if (profile.isActive()) { Log.d("ESIM_DETECT", "检测到已激活的eSIM,ICCID:" + profile.getIccid()); // 此处可添加业务逻辑,如标记eSIM存在 return; } } Log.d("ESIM_DETECT", "存在eSIM Profile,但无激活状态的卡"); } // 权限申请结果回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_READ_PHONE_STATE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { checkEsimStatus(); } else { Log.d("ESIM_DETECT", "权限被拒绝,无法检测eSIM状态"); } } }
3. 低版本兼容性处理(API < 28)
EuiccManager是API 28(Android 9.0)引入的,更低版本设备可通过TelephonyManager辅助判断:
private void checkEsimForOldApi() { TelephonyManager telephonyManager = getSystemService(TelephonyManager.class); List<SubscriptionInfo> subscriptionInfos = telephonyManager.getSubscriptionInfoList(); if (subscriptionInfos == null) return; for (SubscriptionInfo info : subscriptionInfos) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (info.getSimSlotIndex() == SubscriptionManager.SIM_SLOT_INDEX_EUICC) { Log.d("ESIM_DETECT", "检测到eSIM卡槽,号码:" + info.getNumber()); } } else { // 低版本可通过ICCID前缀间接判断(仅供参考) String iccid = info.getIccId(); if (iccid != null && iccid.startsWith("89")) { Log.d("ESIM_DETECT", "疑似eSIM卡,ICCID:" + iccid); } } } }
常见问题排查
- 权限缺失:未申请
READ_PHONE_STATE会导致API调用失败,务必确保权限申请通过。 - 硬件不支持:部分老设备/低端机型无eSIM硬件,
EuiccManager会返回null。 - ROM限制:部分厂商定制ROM可能限制
EuiccManager调用,可尝试TelephonyManager替代方案。
内容的提问来源于stack exchange,提问作者Al Mamun
相关产品推荐
相关产品推荐

