android双卡机中判断当前使用的是那张卡的数据流量

今天主要讲的是在android 5.1及以上如何判断双卡手机中判断当前的流量是使用的那张卡。

(例子中的代码会使用到java反射的知识)


首先判断数据流量开关是否打开:

/**
* 判断数据流量开关是否打开
* @param context
* @return
*/
public static boolean isMobileEnabled(Context context) {
try {
Method getMobileDataEnabledMethod = ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled");`

        getMobileDataEnabledMethod.setAccessible(true);

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        return (Boolean) getMobileDataEnabledMethod.invoke(connectivityManager);

    }catch (Exception e) {

e.printStackTrace();`

    }
    return true;
}

只有在已经打开了流量开关的时候才会去判断是使用的那张卡的流量,当没有开启数据流量时即不用判断。

下边的方法是用于获取当前手机有几张可用的手机卡,获取这些手机卡的基本信息

public static ListgetActiveSubscriptionInfoList(Context context){
SubscriptionManager subscriptionManager=SubscriptionManager.from(context);

​    List list= (List) RefInvoker.invokeMethod(subscriptionManager, SubscriptionManager.class.getName(), "getActiveSubscriptionInfoList",

​            null, null);

​      return list;

}

获取到的基本信息可能如下:

*{id=1, iccId=898600772XXXXXXXXXXX simSlotIndex=0 displayName=中国移动 carrierName=中国移动 nameSource=0 iconTint=-16746133 dataRoaming=0 iconBitmap=android.graphics.Bitmap@7e8713c mcc 460 mnc 0}*

simSlotIndex是卡槽位置,通过卡槽id便可以获取到对应的subId,最后通过subId则可以判断出这张卡的流量是否打开。

获取subId代码如下:

int[] subId = (int[]) RefInvoker.invokeStaticMethod(SubscriptionManager.class.getName(), "getSubId", new Class[]{int.class}, new Object[]{simid});

判断对应手机卡的流量状态代码如下:

TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

int type= (int) RefInvoker.invokeMethod(telephonyManager,TelephonyManager.class.getName(), "getDataNetworkType",new Class[]{int.class}, new Object[]{subId[0]});

此时如果type!=0则表示打开的是此卡的流量。


第一次写文章,可能写的不太好,大家多多包涵。

你可能感兴趣的:(android双卡机中判断当前使用的是那张卡的数据流量)