Flutter技术问询:如何检测并显示设备中的可用eSIM卡?
检测与显示设备eSIM卡的可行方案
第三方SIM检测包通常未完整封装eSIM相关的原生系统API,因此推荐直接基于Android/iOS的原生能力实现,以下分平台给出具体方案:
Android 平台实现
Android 10(API 29)及以上系统提供了明确的eSIM识别API,可通过TelephonyManager获取并筛选eSIM信息:
权限配置
在AndroidManifest.xml中添加所需权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />注意:这些属于危险权限,需要在运行时动态申请用户授权。
原生代码实现(Kotlin示例)
通过TelephonyManager获取所有SIM订阅信息,筛选出eSIM类型:val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val subscriptionList = telephonyManager.getAvailableSubscriptionInfoList() subscriptionList?.forEach { info -> if (info.simType == SubscriptionInfo.SIM_TYPE_ESIM) { // 提取eSIM信息:号码、运营商ID等 val eSimNumber = info.number val carrierName = info.carrierName // 将信息返回给Flutter层 } } }Flutter 桥接
通过MethodChannel将原生获取的eSIM信息传递到Flutter层,实现检测与显示。
iOS 平台实现
iOS 12及以上支持eSIM相关API,可通过CoreTelephony框架识别eSIM:
权限配置
在Info.plist中添加权限描述:<key>NSCellularDataUsageDescription</key> <string>需要访问蜂窝数据信息以检测eSIM</string>原生代码实现(Swift示例)
通过CTTelephonyNetworkInfo获取所有蜂窝服务,筛选嵌入式SIM(eSIM):import CoreTelephony let networkInfo = CTTelephonyNetworkInfo() if let carriers = networkInfo.serviceSubscriberCellularProviders { for (_, carrier) in carriers { if carrier.isEmbedded { // 提取eSIM信息:号码、运营商名称等 let eSimNumber = carrier.mobileNetworkCode let carrierName = carrier.carrierName // 将信息返回给Flutter层 } } }Flutter 桥接
同样通过MethodChannel将iOS原生获取的eSIM信息传递到Flutter业务层。
关键注意事项
- 系统版本要求:Android需API 29+,iOS需12+,低版本系统无原生eSIM支持,无需处理。
- 权限申请:必须确保用户授权相关权限,否则无法获取eSIM信息。
- 多SIM场景:需处理设备同时存在实体SIM和eSIM的情况,区分显示两类SIM的信息。
内容的提问来源于stack exchange,提问作者dsm_crew
相关产品推荐
相关产品推荐

