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

如何检测双卡设备中提供移动数据的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卡订阅ID
  • SubscriptionInfo:包含了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 08:57:36