【问题标题】:On Android dual sim phone, how to detect which SIM card has data enabled?在Android双卡手机上,如何检测哪个SIM卡启用了数据?
【发布时间】:2019-08-15 03:41:07
【问题描述】:

我正在编写一个网络监视器应用程序。我想检测双卡手机中的哪个 SIM 卡启用了数据?

我已经为两张 SIM 卡尝试了 TelephonyManager.isDataEnabled() 方法。但该方法返回为两个 SIM 卡启用。相反,我应该启用一张 SIM 卡并禁用另一张。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {

    SubscriptionManager subManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
    List<SubscriptionInfo> subscriptionInfoList = subManager.getActiveSubscriptionInfoList();

    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        TelephonyManager mgr = telephonyManager.createForSubscriptionId(subscriptionInfoList.get(0).getSubscriptionId());
            int isDataEnabledSIM1 = mgr.isDataEnabled()?1:0;

            mgr = telephonyManager.createForSubscriptionId(subscriptionInfoList.get(1).getSubscriptionId());
            int isDataEnabledSIM2 = mgr.isDataEnabled()?1:0;

            Log.d(TAG, "isDataEnabledSIM1: "+isDataEnabledSIM1 + ", isDataEnabledSIM2="+isDataEnabledSIM2);
    }
}

isDataEnabledSIM1 和 isDataEnabledSIM2 均返回 1,表示两个 SIM 卡上都启用了数据。这显然是不正确的,我只希望一张 SIM 卡为 1,另一张为 0。

【问题讨论】:

标签: android telephonymanager


【解决方案1】:

您可以使用 SubscriptionManager 中的 getDefaultDataSubscriptionId()(对于 N 和更高版本),在 N 下您可以使用反射。示例:

public static int getDefaultDataSubscriptionId(Context context) {
    SubscriptionManager subscriptionManager = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
        subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        int nDataSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();

        if (nDataSubscriptionId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
            return (nDataSubscriptionId);
        }
    }

    try {
        Class<?> subscriptionClass = Class.forName(subscriptionManager.getClass().getName());
        try {
            Method getDefaultDataSubscriptionId = subscriptionClass.getMethod("getDefaultDataSubId");

            try {
                return ((int) getDefaultDataSubscriptionId.invoke(subscriptionManager));
            } catch (IllegalAccessException e) {
                return ERROR_CODE_EXCEPTION_HANDLED;
            } catch (InvocationTargetException e) {
                return ERROR_CODE_EXCEPTION_HANDLED;
            }
        } catch (NoSuchMethodException e) {
            return ERROR_CODE_NO_SUCH_METHOD;
        }
    } catch (ClassNotFoundException e) {
        return ERROR_CODE_EXCEPTION_HANDLED;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多