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

一  获取获取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. Jenkins 学习笔记

    Jenkins 的内容网站蛮多的,但是一开始我看起来确实很费劲.似乎好多东西都是悬空的,没有把底层的信息交代清楚. 我把自己对于 Jenkins 的探索过程记录下来,如下. 目录 Jenkins 学习 ...

  2. jQuery DOM 元素方法 (十)

    函数 描述 .get() 获得由选择器指定的 DOM 元素. .index() 返回指定元素相对于其他指定元素的 index 位置. .size() 返回被 jQuery 选择器匹配的元素的数量. . ...

  3. Gulp自动化构建工具的简单使用

    相关网站 gulp官方网址:http://gulpjs.com gulp中文网站:http://www.gulpjs.com.cn/ gulp插件地址:http://gulpjs.com/plugin ...

  4. linux 卸载安装node npm

    1. 卸载node npm (1) 先卸载 npm: sudo npm uninstall npm -g (2) 然后卸载 Node.js. (2.1) 如果是 Ubuntu 系统并使用 apt-ge ...

  5. Chris Richardson微服务翻译:微服务部署

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服务部署( ...

  6. JMeter基本元素简介

    JMeter基本元素简介 一.测试计划 测试计划对象有一个复选框叫做"Functional Testing"(函数测试模式),如果选中,它将使jmeter记录服务端返回的每一个样例 ...

  7. PHP面向对象编程基本原则

    首先祝大家节日快乐!!! 额,不知道你们剁手没,小梦是没有!整整已经错过了第九个年头! 小伙伴是不是有一种感觉,PHP入门的时候简直爱不释手,总是把 "PHP是世界上最好的语言" ...

  8. C# 生成二维码 QRCoder

    最近项目上有个需求,需要将某个文件的下载地址生成二维码,并展示到网页上. 目前网上生成二维码的方法有好几种,本文将介绍[QRCoder]生成二维码的方式 一.首先通过VS中的[NUGET]下载并引用Q ...

  9. 新浪新闻页面抓取(JAVA-Jsoup)

    1.使用gradle建立工程: 工程格式如下: include ':spider-demo' rootProject.name = 'my-spider-demo' settings def void ...

  10. Java Web应用集成OSGI

    对OSGI的简单理解 就像Java Web应用程序需要运行在Tomcat.Weblogic这样的容器中一样.程序员开发的OSGI程序包也需要运行在OSGI容器中.目前主流的OSGI容器包括:Apach ...