Android 双卡获取当前使用流量在线卡的信息
最近接触了一个项目,需要获取在线流量卡的信息,下面的方式,可以获取大部分手机的正确手机卡信息。
一 获取获取IMEI
public static String getDeviced(int soltId,Context context) {
return (String) getPhoneInfo(soltId,"getDeviceId", context);
}
获取 IMSI
public static String getSubscriberId(int subId, Context context) { String imsi = (String) getPhoneInfo(subId, "getSubscriberId", context); return imsi; }
获取 iccid
public static String getSimSerialNumber(int subId, Context context) { String imsi = (String) getPhoneInfo(subId, "getSimSerialNumber", context); return imsi; }
subId 为卡槽 id
二、双卡的时候获取哪个卡是使用流量的卡
@SuppressLint("MissingPermission") public static Integer getDefaultDataSubId(Context context) { Integer id = -1; try { SubscriptionManager sm = null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { sm = SubscriptionManager.from(context.getApplicationContext()); Method getSubId = sm.getClass().getMethod("getDefaultDataSubId"); if(getSubId != null) { id = (int) getSubId.invoke(sm); } } } catch (NoSuchMethodException e) { try { SubscriptionManager sm = null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { sm = SubscriptionManager.from(context.getApplicationContext()); Method getSubId = sm.getClass().getMethod("getDefaultDataSubscrptionId"); if(getSubId != null) { id = (int) getSubId.invoke(sm); } } } catch (NoSuchMethodException e1) { // try { SubscriptionManager sm = null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { sm = SubscriptionManager.from(context.getApplicationContext()); Method getSubId = sm.getClass().getMethod("getDefaultDataPhoneId"); // Method getSubId = Class.forName("android.telephony.SubscriptionManager").getDeclaredMethod("getSubId", new Class[]{Integer.TYPE}); if(getSubId != null) { id = (int) getSubId.invoke(sm); Log.v("",(int) getSubId.invoke(sm) + ""); } } } catch (NoSuchMethodException e2) { e.printStackTrace(); } catch (IllegalAccessException e2) { e.printStackTrace(); } catch (InvocationTargetException e2) { e.printStackTrace(); } } catch (IllegalAccessException e1) { e.printStackTrace(); } catch (InvocationTargetException e1) { e.printStackTrace(); } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return id; }
使用 getDefaultDataSubId 可以获取大部分手机哪个是在线的数据的卡 ,getDefaultDataSubscrptionId 是荣耀系列的手机能获取到,但小米、红米.vivo 等手机的获取不到。
上面两个可以获取大部分的,三星的好像不行,三星的把副卡的数据流量打开时,会自动关闭主卡。三星的使用 这个getDefaultDataPhoneId , 这个可以获取到三星的哪个手机卡在线吗,但是当使用上面的获取SIMI 的方法时,两个卡,返回的都是主卡的值。
对三星的手机做了一下特殊处理:
if ( Utils.getSubscriberId(0,mContext).equals( Utils.getSubscriberId(1,mContext))) { if (id == 1) { imsi=SystemUtil.getPhoneIMSI(mContext); imei=SystemUtil.getIMEI(mContext); iccid=SystemUtil.getPhoneICCID(mContext); }else { imsi=Utils.getSubscriberId(id,mContext); imei=Utils.getDeviced(id,mContext); iccid=Utils.getSimSerialNumber(id,mContext); } }else { imsi=Utils.getSubscriberId(id,mContext); imei=Utils.getDeviced(id,mContext); iccid=Utils.getSimSerialNumber(id,mContext); }
当传 0、 1 时获取到的SIMI 信息一样时
获取副卡信息 使用 下面的方法
@SuppressLint("MissingPermission") public static String getPhoneIMSI(Context context) { TelephonyManager mTelephonyMgr = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String str = ""; try { str=mTelephonyMgr.getSubscriberId(); }catch (Exception e) { str = ""; } return str; }
@SuppressLint("MissingPermission") public static String getIMEI(Context ctx) { TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE); if (tm != null) { try { return tm.getDeviceId(); }catch (Exception e) { return ""; } } return null; }
@SuppressLint("MissingPermission") public static String getPhoneICCID(Context context) { TelephonyManager mTelephonyMgr = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); try { return mTelephonyMgr.getSimSerialNumber(); }catch (Exception e) { return ""; } }
获取主卡信息 ,还可以使用 一 标题里面的方法。