Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题
由于国内的运营商问题,双卡手机获取IMSI号问题要根据厂商API 来实现。
下面我们就来做一套完整的分析运营商获取IMSI号逻辑。
1,首先我们要判断手机的平台。
1.1,判断手机是否MTK平台
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
public static MtkDoubleInfo initMtkDoubleSim(Context mContext) { MtkDoubleInfo mtkDoubleInfo = new MtkDoubleInfo(); try { TelephonyManager tm = (TelephonyManager) mContext .getSystemService(Context.TELEPHONY_SERVICE); Class<?> c = Class.forName("com.android.internal.telephony.Phone"); Field fields1 = c.getField("GEMINI_SIM_1"); fields1.setAccessible(true); mtkDoubleInfo.setSimId_1((Integer) fields1.get(null)); Field fields2 = c.getField("GEMINI_SIM_2"); fields2.setAccessible(true); mtkDoubleInfo.setSimId_2((Integer) fields2.get(null)); Method m = TelephonyManager.class.getDeclaredMethod( "getSubscriberIdGemini", int.class); mtkDoubleInfo.setImsi_1((String) m.invoke(tm, mtkDoubleInfo.getSimId_1())); mtkDoubleInfo.setImsi_2((String) m.invoke(tm, mtkDoubleInfo.getSimId_2())); Method m1 = TelephonyManager.class.getDeclaredMethod( "getDeviceIdGemini", int.class); mtkDoubleInfo.setImei_1((String) m1.invoke(tm, mtkDoubleInfo.getSimId_1())); mtkDoubleInfo.setImei_2((String) m1.invoke(tm, mtkDoubleInfo.getSimId_2())); Method mx = TelephonyManager.class.getDeclaredMethod( "getPhoneTypeGemini", int.class); mtkDoubleInfo.setPhoneType_1((Integer) mx.invoke(tm, mtkDoubleInfo.getSimId_1())); mtkDoubleInfo.setPhoneType_2((Integer) mx.invoke(tm, mtkDoubleInfo.getSimId_2())); if (TextUtils.isEmpty(mtkDoubleInfo.getImsi_1()) && (!TextUtils.isEmpty(mtkDoubleInfo.getImsi_2()))) { mtkDoubleInfo.setDefaultImsi(mtkDoubleInfo.getImsi_2()); } if (TextUtils.isEmpty(mtkDoubleInfo.getImsi_2()) && (!TextUtils.isEmpty(mtkDoubleInfo.getImsi_1()))) { mtkDoubleInfo.setDefaultImsi(mtkDoubleInfo.getImsi_1()); } } catch (Exception e) { mtkDoubleInfo.setMtkDoubleSim(false); return mtkDoubleInfo; } mtkDoubleInfo.setMtkDoubleSim(true); return mtkDoubleInfo; } |
直接判断异常。出现异常证明就不是MTK平台了。
1.2判断手机是否高通平台
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public static GaotongDoubleInfo initQualcommDoubleSim(Context mContext) { GaotongDoubleInfo gaotongDoubleInfo = new GaotongDoubleInfo(); gaotongDoubleInfo.setSimId_1(0); gaotongDoubleInfo.setSimId_2(1); try { Class<?> cx = Class .forName("android.telephony.MSimTelephonyManager"); Object obj = mContext.getSystemService("phone_msim"); Method md = cx.getMethod("getDeviceId", int.class); Method ms = cx.getMethod("getSubscriberId", int.class); gaotongDoubleInfo.setImei_1((String) md.invoke(obj, gaotongDoubleInfo.getSimId_1())); gaotongDoubleInfo.setImei_2((String) md.invoke(obj, gaotongDoubleInfo.getSimId_2())); gaotongDoubleInfo.setImsi_1((String) ms.invoke(obj, gaotongDoubleInfo.getSimId_1())); gaotongDoubleInfo.setImsi_2((String) ms.invoke(obj, gaotongDoubleInfo.getSimId_2())); } catch (Exception e) { e.printStackTrace(); gaotongDoubleInfo.setGaotongDoubleSim(false); return gaotongDoubleInfo; } return gaotongDoubleInfo; } |
一样出现异常就不是高通双卡平台了
然后我们在整理下逻辑
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/** * @param c * @return 返回平台数据 */public Object isDoubleSim(Context c) { GaotongDoubleInfo gaotongDoubleInfo = MultiSimUtility .initQualcommDoubleSim(c); MtkDoubleInfo mtkDoubleInfo = MultiSimUtility.initMtkDoubleSim(c); boolean isGaoTongCpu = gaotongDoubleInfo.isGaotongDoubleSim(); boolean isMtkCpu = mtkDoubleInfo.isMtkDoubleSim(); if (isGaoTongCpu) { // 高通芯片双卡 return gaotongDoubleInfo; } else if (isMtkCpu) { // MTK芯片双卡 return mtkDoubleInfo; } else { //普通单卡手机 return null; } } |
这个时候我们基本上获取到了手机的平台和每张卡的信息。单卡手机获取信息就不贴代码了。
Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题的更多相关文章
- # Linux Whois3获取 运营商信息
Linux Whois3获取 运营商信息 APNIC是管理亚太地区IP地址分配的机构,它有着丰富准确的IP地址分配库,同时这些信息也是对外公开的,并提供了一个查询工具,下面就让我们看看如何在Linux ...
- iOS获取运营商的相关信息
1.导入:CoreTelephony.framework 2.添加头文件 #import <CoreTelephony/CTTelephonyNetworkInfo.h> #import ...
- android获取设备全部信息
private static final String FILE_MEMORY = "/proc/meminfo"; private static final String FIL ...
- MTK Android 读取SIM卡参数,获取sim卡运营商信息
android 获取sim卡运营商信息(转) TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TE ...
- Android系统分析之运营商显示流程分析之运营商信息的读取流程二
运营商显示流程分析之运营商信息的读取流程 一. SIM卡运营商信息的读取 从前面的 运营商信息的获取和赋值 可以知道SIM卡运营商的赋值最终是在 SIMRecords 中完成的, 而SIM卡信息的相关 ...
- Android基础总结(精华完整版)
1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速率一般在几百Kbps,较之前的2G和2.5G在数据传输速度上有很大提升. Ÿ 第四代移动通信技术( ...
- [Q]“获取AutoCAD安装信息时失败...”解决方法
“获取AutoCAD安装信息时失败...”解决方法:在“setup.exe”上右键,以管理员权限运行即可.
- 获取及管理Android 手机运营商及状态
主要类 TelephonyManager: telephonyManager.getCellLocation();//获得服务区 telephonyManager.getCellId();//获得服务 ...
- PHP--根据手机号-淘宝平台获取归属地运营商信息
//获取手机账号信息 public function get_mobile_area($mobile){ $sms = array('province'=>'', 'supplier'=> ...
随机推荐
- bzoj 3165: [Heoi2013]Segment 动态凸壳
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 202 Solved: 89[Submit][Stat ...
- bzoj 1815: [Shoi2006]color 有色图 置换群
1815: [Shoi2006]color 有色图 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 136 Solved: 50[Submit][Stat ...
- php 文件下载 以及 file_exists找不到文件的解决方案
链接:<a href="upload/file/download.php?filename=雨人工作室.doc" target="_blank" > ...
- Intellij IDEA快速编写代码经验总结
sout=System.out.println(); soutp=System.out.println(""); soutv=System.out.println("变量 ...
- 配置.NET程序中最大HTTP并发连接数(默认为2)
方式一:代码 ServicePointManager.DefaultConnectionLimit = 方式二:配置 <system.net> <connectionManageme ...
- InvalidIndexNameException[Invalid index name [2Shard], must be lowercase]
[2016-10-11 14:16:42,191][DEBUG][action.admin.indices.create] [Feron] [2Shard] f ailed to create [2S ...
- <1>数据引用与匿名存储
引用本身就是一种标量变量 引用变量,如 $ra 或$rarray ,就是一种普通的标量变量,因为我们使用"$" 符号. 变量变量可以是一个整数,一个字符串或者一个引用,而且还可以被 ...
- WordPress Tweet Blender插件跨站脚本漏洞
漏洞名称: WordPress Tweet Blender插件跨站脚本漏洞 CNNVD编号: CNNVD-201310-645 发布时间: 2013-10-30 更新时间: 2013-10-30 危害 ...
- 浅析五大ASP.NET数据控件
转自:http://kb.cnblogs.com/page/69207/ 摘要:ASP.NET中有不少的控件,在这当中有一部分是用来处理数据的控件.在这里我们正要讨论的就是ASP.NET数据控件,希望 ...
- VS2010引用项目dll,编译时报错
截图出处:http://www.cnblogs.com/wuhuisheng/archive/2012/02/13/2349754.html