如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?

Posted

技术标签:

【中文标题】如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?【英文标题】:How to know which SIM is consuming mobile data in dual SIM android phone? 【发布时间】:2017-08-08 17:17:58 【问题描述】:

我正在构建一个网络监视器应用程序。在这里,我已经成功实现了所有功能,例如跟踪 Wifi 或移动数据的数据使用情况,但我想知道哪个 SIM 连接到互联网并使用移动数据。

使用下面的代码,我可以知道我的双卡手机是否连接到 Wifi 或移动数据。

public static String isInternetConnected (Context ctx) 
    ConnectivityManager connectivityMgr = (ConnectivityManager) ctx
            .getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo wifi = connectivityMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo mobile = connectivityMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    // Check if wifi or mobile network is available or not. If any of them is
    // available or connected then it will return true, otherwise false;
    if (wifi != null) 
        if (wifi.isConnected()) 
            return "wifi";
        
    
    if (mobile != null) 
        if (mobile.isConnected()) 
            return "mobile";
        
    
    return "none";

如何获取双卡安卓手机中消耗移动数据的 SIM 索引或 SIM 运营商名称?

我搜索了很多,我看到很多问题都发布在 SO 中,但没有答案,例如 this。

我能够在双 SIM 卡手机中获取两个 SIM 卡的子 ID,但我正在逐步解决问题,以了解哪个 SIM 卡正在使用互联网。

许多其他应用程序都能够像 Mubble 一样做到这一点。

谁能给我一个解决方案?

【问题讨论】:

【参考方案1】:

api level 22之后,可以通过反射使用hidden system apiandroid.telephony.SubscriptionManager#getDefaultDataSubId获取当前活跃数据sim订阅索引。

api level 24之后,有公共系统apiandroid.telephony.SubscriptionManager#getDefaultDataSubscriptionId获取当前活跃数据sim订阅索引。

然后,您可以从订阅索引中创建android.telephony.TelephonyManagerandroid.telephony.SubscriptionManager#getActiveSubscriptionInfo 以获取sim 运营商信息。

这里有一个简单的解决方案来获取双卡手机的数据卡运营商。

    public static String getDataSimOperator(Context context) 
        if (context == null) 
            return null;
        

        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (tm != null) 
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) 
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) 
                    int dataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
                    TelephonyManager dataSimManager = tm.createForSubscriptionId(dataSubId);
                    return dataSimManager.getSimOperator();
                 else 
                    String operator = getDataSimOperatorBeforeN(context);
                    if (operator != null) 
                        return operator;
                     else 
                        return tm.getSimOperator();
                    
                
             else 
                return tm.getSimOperator();
            
        
        return null;
    

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
    private static String getDataSimOperatorBeforeN(Context context) 
        if (context == null) 
            return null;
        

        int dataSubId = -1;
        try 
            Method getDefaultDataSubId = SubscriptionManager.class.getDeclaredMethod("getDefaultDataSubId");
            if (getDefaultDataSubId != null) 
                getDefaultDataSubId.setAccessible(true);
                dataSubId = (int) getDefaultDataSubId.invoke(null);
            
         catch (Exception e) 
            e.printStackTrace();
        
        if (dataSubId != -1) 
            SubscriptionManager sm = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
            if (sm != null && ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE)
                    == PackageManager.PERMISSION_GRANTED) 
                SubscriptionInfo si = sm.getActiveSubscriptionInfo(dataSubId);
                if (si != null) 
                    // format keep the same with android.telephony.TelephonyManager#getSimOperator
                    // MCC + MNC format
                    return String.valueOf(si.getMcc()) + si.getMnc();
                
            
        
        return null;
    

【讨论】:

以上是关于如何知道双 SIM 安卓手机中哪个 SIM 卡正在消耗移动数据?的主要内容,如果未能解决你的问题,请参考以下文章

Android USSD 哪个 sim 卡收到 ussd 消息或哪个 sim 插槽收到 ussd 消息(双卡手机)

如何查看双卡手机的本机号码?

双卡双待有一张卡不显示手机号正常么

如何向安卓手机批量导入通讯录

打磨TF卡叠加SIM的注意问题

下一款大屏iPhone采用双SIM卡设计