如何检测双卡设备中提供移动数据的SIM卡运营商?
解决双卡设备中识别移动数据对应SIM卡的问题
你当前的代码确实能很好地区分WiFi和移动数据连接,但在双卡设备上要定位到具体哪张SIM卡提供数据服务,需要借助Android的双卡相关API,不同系统版本的实现方式略有不同,下面分情况给你说明:
一、Android 6.0(API 23)及以上版本
从API 23开始,Android正式提供了双卡管理的API,我们可以通过TelephonyManager和SubscriptionManager来获取数据连接对应的SIM卡信息:
核心步骤:
- 获取当前活跃的数据连接对应的Subscription ID
- 通过Subscription ID查询对应的SIM卡订阅信息,包括运营商名称、卡槽位置等
代码示例:
首先,需要在Manifest中添加必要权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
然后修改你现有的代码,加入双卡识别逻辑:
// 获取TelephonyManager和SubscriptionManager实例 TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if(ni.getDetailedState().toString().toLowerCase().equals("connected")){ tv.setText(" Typename: "+ni.getTypeName()); tv.append("\n Detailed state: "+ni.getDetailedState()); tv.append("\n Extra Info: "+ni.getExtraInfo()); tv.append("\n Type: "+ni.getType()); tv.append("\n Reason :"+ni.getReason()); tv.append("\n SubType Name :"+ni.getSubtypeName()); tv.append("\n SubType :"+ni.getSubtype()); tv.append("\n State :"+ni.getState()); if(!ni.getTypeName().toString().toLowerCase().equals("wifi")){ // 处理移动数据的SIM卡识别逻辑 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 获取当前数据连接对应的订阅ID int dataSubId = telephonyManager.getDataSubscriptionId(); // 通过订阅ID获取SIM卡详细信息 SubscriptionInfo subscriptionInfo = subscriptionManager.getActiveSubscriptionInfo(dataSubId); if (subscriptionInfo != null) { String carrierName = subscriptionInfo.getCarrierName().toString(); int slotIndex = subscriptionInfo.getSimSlotIndex(); // 卡槽位置从0开始计数 tv.append("\n Carrier:"+carrierName); tv.append("\n 对应SIM卡槽: 第"+(slotIndex+1)+"张"); } else { tv.append("\n 无法获取当前SIM卡信息"); } } else { tv.append("\n 系统版本低于Android 6.0,不支持双卡识别"); } } } }
关键点说明:
getDataSubscriptionId():这是定位具体SIM卡的核心方法,返回当前用于移动数据的SIM卡订阅IDSubscriptionInfo:包含了SIM卡的运营商名称、卡槽位置、号码等关键信息- 注意动态权限:Android 6.0及以上版本需要动态申请
READ_PHONE_STATE权限,否则会获取不到数据
二、Android 5.1(API 22)及以下版本
遗憾的是,API 22及以下没有官方的双卡管理API,无法直接获取数据连接对应的SIM卡信息。如果你的应用需要兼容这些旧版本,只能通过一些非官方的间接方式(比如读取系统隐藏接口),但这些方法稳定性差且可能违反Google Play政策,建议优先引导用户升级系统,或者在旧版本中提示无法识别具体SIM卡。
补充提示
- 部分厂商可能对双卡API有自定义实现,测试时尽量覆盖不同品牌的设备
- 当用户切换数据SIM卡时,需要监听网络状态变化事件,重新获取最新的SIM卡信息
内容的提问来源于stack exchange,提问作者Julie Jon
相关产品推荐
相关产品推荐

