最近接触了一个项目,需要获取在线流量卡的信息,下面的方式,可以获取大部分手机的正确手机卡信息。

一  获取获取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 "";
        }

    }

获取主卡信息 ,还可以使用  一 标题里面的方法。

 

版权声明:本文为yxb-home原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yxb-home/p/8385768.html