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

问题描述 投票:6回答:1

我正在建立一个网络监控程序。在这里,我已经成功地实现了所有的事情,如跟踪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卡运营商名称?

我搜索了很多,看到很多问题都没有答案,如 这个.

我能够在双卡手机中获得两个SIM卡的subId,但我有相位问题,不知道哪个SIM卡在使用互联网。

许多其他应用程序能够做到这一点,如Mubble。

任何一个人可以为我提供一个解决方案吗?

android operating-system android-networking internet-connection dual-sim
1个回答
0
投票

当api等级达到22级后,你就可以使用了。隐蔽系统api android.telephony.SubscriptionManager#getDefaultDataSubId 通过反射来获取当前活跃的数据模拟订阅指数。

在api等级24级之后,有一个公共系统api。android.telephony.SubscriptionManager#getDefaultDataSubscriptionId 以获取当前活跃的数据模拟订阅指数。

然后,您可以创建一个 android.telephony.TelephonyManagerandroid.telephony.SubscriptionManager#getActiveSubscriptionInfo 从订阅指数中获取SIM卡运营商信息。

以下是获取双卡手机数据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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.