Android双卡(实体SIM+eSIM)如何同时获取CellInfo与信号强度
如何获取双卡(实体SIM+eSIM)的CellInfo与信号强度
默认的TelephonyManager实例仅会返回主SIM卡的数据,要同时获取主副卡的CellInfo与信号强度,核心思路是针对每个激活的SIM订阅创建专属的TelephonyManager实例,结合你已用到的SubscriptionManager.getActiveSubscriptionInfoList()接口,具体实现步骤如下:
第一步:申请必要权限
在AndroidManifest.xml中声明权限,Android 6.0及以上需动态申请危险权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 获取CellInfo必须权限 -->第二步:获取所有激活的SIM订阅信息
利用你已调研到的接口拿到双卡的基础信息:SubscriptionManager subscriptionManager = getSystemService(SubscriptionManager.class); List<SubscriptionInfo> activeSubscriptions = subscriptionManager.getActiveSubscriptionInfoList();第三步:遍历订阅,获取对应SIM的CellInfo与信号强度
对每个SubscriptionInfo,通过createForSubscriptionId()创建专属TelephonyManager,再调用接口获取目标数据:if (activeSubscriptions != null) { for (SubscriptionInfo info : activeSubscriptions) { int subId = info.getSubscriptionId(); // 创建对应SIM卡的TelephonyManager实例 TelephonyManager simTelephonyManager = getSystemService(TelephonyManager.class) .createForSubscriptionId(subId); // 获取当前SIM的CellInfo列表 List<CellInfo> cellInfos = simTelephonyManager.getAllCellInfo(); // 获取当前SIM的信号强度(API 29+建议用getSignalStrengths()适配5G等新类型) SignalStrength signalStrength = simTelephonyManager.getSignalStrength(); // 结合info中的MCC/MNC、运营商名称等标识,区分处理主副卡数据 } }关键注意点:
- API版本兼容:
createForSubscriptionId()从API 22开始可用;API 29及以上推荐使用getSignalStrengths()替代getSignalStrength(),以支持多频段信号数据 - 厂商适配:部分设备厂商对双卡数据获取有额外限制,需在目标机型上验证兼容性
- 权限校验:动态申请权限后,需确认权限已授予再执行数据获取逻辑
- API版本兼容:
内容的提问来源于stack exchange,提问作者Akshay Chougule
相关产品推荐
相关产品推荐

