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

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

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

Android 双卡获取当前使用流量在线卡的信息的更多相关文章

  1. 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

    众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...

  2. Android记录3--ExpandableListView使用+获取SIM卡状态信息

    Android记录3--ExpandableListView使用+获取SIM卡状态信息 2013年8月9日Android记录 ExpandableListView是一个可以实现下拉列表的控件,大家可能 ...

  3. Android学习笔记-获取手机内存,SD卡存储空间。

    前面介绍到如何保存数据到手机内存或者SD卡,但是问题是,在保存以前,我们还需要对他们的空间(可用空间),进行判断,才可以进行后续操作,所以,本节我们就介绍如何获取手机内存以及Sd卡的空间. //这时获 ...

  4. android 双卡手机发短信/判断手机是否为双卡

    通过反射发现sendMultipartTextMessage多了一个phoneType的参数,这个参数就是这只用GMS还是CDMA卡发送的. phoneType获取方法,iTelephony.getA ...

  5. android自动获取短信验证码

    前言:android应用的自动化测试必然会涉及到注册登录功能,而许多的注册登录或修改密码功能常常需要输入短信验证码,因此有必要能够自动获得下发的短信验证码.主要就是实时获取短信信息.android上获 ...

  6. android中获取root权限的方法以及原理(转)

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...

  7. Android—将Bitmap图片保存到SD卡目录下或者指定目录

    直接上代码就不废话啦 一:保存到SD卡下 File file = new File(Environment.getExternalStorageDirectory(), System.currentT ...

  8. Android NFC近场通信03----读写MifareClassic卡

                                           Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来 ...

  9. URL转Drawable之 Android中获取网络图片的三种方法

    转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...

随机推荐

  1. IntelliJ IDEA2017.3 激活

    网上IntelliJ IDEA激活方式大多均已失效,目前常用激活方式为License Server 激活: http://idea.imsxm.com/ NOTE: 在上周五2017-12-1那天还是 ...

  2. HTML5本地存储应用sessionStorage和localStorage

    在html5之前,浏览器要实现数据的存储,一般都是用cookie,但是cookie有域名和大小限定. html5流行之后,可以通过localStorage和sessionStorage实现浏览器端的数 ...

  3. jQuery 数据操作函数(九)

    .clearQueue() 从队列中删除所有未运行的项目. .data() 存储与匹配元素相关的任意数据. jQuery.data() 存储与指定元素相关的任意数据. .dequeue() 从队列最前 ...

  4. Java框架之Spring MVC(二)

    一.Spring MVC 验证 JSR 303 是ajvaEE6 中的一项子规范 ,叫 Bean Validation 用于对javaBean中的字段进行校验. 官方的参考实现是: Hibernate ...

  5. git使用过程中遇到的问题及处理方法

    1. Your local changes to the following files would be overwritten by checkout:......Please commit yo ...

  6. 微信小程序——Now you can provide attr "wx:key" for a "wx:for" to improve performance.

    在官方的swiper(滑块视图容器)中demo代码,运行时会出现Now you can provide attr "wx:key" for a "wx:for" ...

  7. 知乎上看到的关于类.class,对象.getClass

    public class TestDemo { //测试 @Test public void fun01() { TestDemo q=new TestDemo(); A a = new A(); q ...

  8. strace命令【转】

    strace命令使用: strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用 ...

  9. [搬运]在C#使用.NET设计模式的新观点

    原文地址:http://www.dotnetcurry.com/dotnet/1092/dotnet-design-patterns 软件开发有许多设计模式.其中一些模式非常受欢迎.说几乎所有的模式都 ...

  10. 【测试编码URI的函数】

    //测试编码URI的函数 var url="http://www.phpfamily.org/test.php?search= this is a test&sum=1+2" ...