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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:39:21