是不是所有的Android手机都可以获得IMSimei和imsiEI码? 会不会有的Android手机取不出来?

关于android各种双卡手机获取imei,imsi的处理(mtk,展讯,高通等)_小组_ThinkSAAS
关于android各种双卡手机获取imei,imsi的处理(mtk,展讯,高通等)
关于android各种双卡手机获取imei,imsi的处理(mtk,展讯,高通等)
目前国内对于双卡智能手机的需求还是很大的,各种复杂的业务会涉及到双卡模块;而android标准的api又不提供对双卡的支持。导致国内双卡模块标准混乱,各个厂商各玩各的。目前我知道的双卡解决方案就有:mtk,展讯,高通,broadcom等。
由于公司业务需要,必须要对双卡手机获取各自的imei,imsi,所以也做了一些研究:
首先是最为应用广泛的mtk平台,国内山寨手机以及一些低端品牌双卡都是做的mtk的双卡解决方案
private static void initMtkDoubleSim() {
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);
simId_1 = (Integer) fields1.get(null);
Field fields2 = c.getField("GEMINI_SIM_2");
fields2.setAccessible(true);
simId_2 = (Integer) fields2.get(null);
Method m = TelephonyManager.class.getDeclaredMethod(
"getSubscriberIdGemini", int.class);
imsi_1 = (String) m.invoke(tm, simId_1);
imsi_2 = (String) m.invoke(tm, simId_2);
Method m1 = TelephonyManager.class.getDeclaredMethod(
"getDeviceIdGemini", int.class);
imei_1 = (String) m1.invoke(tm, simId_1);
imei_2 = (String) m1.invoke(tm, simId_2);
Method mx = TelephonyManager.class.getDeclaredMethod(
"getPhoneTypeGemini", int.class);
phoneType_1 = (Integer) mx.invoke(tm, simId_1);
phoneType_2 = (Integer) mx.invoke(tm, simId_2);
if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) {
defaultImsi = imsi_2;
if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) {
defaultImsi = imsi_1;
} catch (Exception e) {
isMtkDoubleSim =
isMtkDoubleSim =
可见,在TelephonyManager中提供了**Gemini的方法,可以用反射很方便地获取到相应的信息。
private static void initMtkSecondDoubleSim() {
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);
simId_1 = (Integer) fields1.get(null);
Field fields2 = c.getField("GEMINI_SIM_2");
fields2.setAccessible(true);
simId_2 = (Integer) fields2.get(null);
Method mx = TelephonyManager.class.getMethod("getDefault",
int.class);
TelephonyManager tm1 = (TelephonyManager) mx.invoke(tm, simId_1);
TelephonyManager tm2 = (TelephonyManager) mx.invoke(tm, simId_2);
imsi_1 = tm1.getSubscriberId();
imsi_2 = tm2.getSubscriberId();
imei_1 = tm1.getDeviceId();
imei_2 = tm2.getDeviceId();
phoneType_1 = tm1.getPhoneType();
phoneType_2 = tm2.getPhoneType();
if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) {
defaultImsi = imsi_2;
if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) {
defaultImsi = imsi_1;
} catch (Exception e) {
isMtkSecondDoubleSim =
isMtkSecondDoubleSim =
看样子有似乎也是属于mtk平台的解决方案,因为都有GEMINI_SIM_1属性,这种双卡方案只在联想278t上发现过;有两个TelephonyManager实例,根据getDefault方法获取
下面是展讯平台的(貌似市面上手机不多啊):
private static void initSpreadDoubleSim() {
Class&?& c = Class
.forName("com.android.internal.telephony.PhoneFactory");
Method m = c.getMethod("getServiceName", String.class, int.class);
spreadTmService = (String) m
.invoke(c, Context.TELEPHONY_SERVICE, 1);
TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
imsi_1 = tm.getSubscriberId();
imei_1 = tm.getDeviceId();
phoneType_1 = tm.getPhoneType();
TelephonyManager tm1 = (TelephonyManager) mContext.getSystemService(spreadTmService);
imsi_2 = tm1.getSubscriberId();
imei_2 = tm1.getDeviceId();
phoneType_2 = tm1.getPhoneType();
if (TextUtils.isEmpty(imsi_1) && (!TextUtils.isEmpty(imsi_2))) {
defaultImsi = imsi_2;
if (TextUtils.isEmpty(imsi_2) && (!TextUtils.isEmpty(imsi_1))) {
defaultImsi = imsi_1;
} catch (Exception e) {
isSpreadDoubleSim =
isSpreadDoubleSim =
这个没有展讯sdk的话还是很难找的吧?
下面是高通的:(貌似高通做的不咋的有些接口没有双卡实现啊)
public static void initQualcommDoubleSim() {
TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
Class&?& cx = Class
.forName("android.telephony.MSimTelephonyManager");
Object obj =mContext.getSystemService(
"phone_msim");
simId_1 = 0;
simId_2 = 1;
Method mx = cx.getMethod("getDataState");
// int stateimei_1 = (Integer) mx.invoke(cx.newInstance());
int stateimei_2 = tm.getDataState();
Method mde = cx.getMethod("getDefault");
Method md = cx.getMethod("getDeviceId", int.class);
Method ms = cx.getMethod("getSubscriberId", int.class);
Method mp = cx.getMethod("getPhoneType");
// Object obj = mde.invoke(cx);
imei_1 = (String) md.invoke(obj, simId_1);
imei_2 = (String) md.invoke(obj, simId_2);
imsi_1 = (String) ms.invoke(obj, simId_1);
imsi_2 = (String) ms.invoke(obj, simId_2);
int statephoneType_1 = tm.getDataState();
int statephoneType_2 = (Integer) mx.invoke(obj);
Log.e("tag", statephoneType_1 +"---"+ statephoneType_2);
// Class&?& msc = Class.forName("android.telephony.MSimSmsManager");
// for (Method m : msc.getMethods()) {
// if (m.getName().equals("sendTextMessage")) {
// m.getParameterTypes();
// Log.e("tag", m.getName());
} catch (Exception e) {
isQualcommDoubleSim =
isQualcommDoubleSim =
getPhoneType&getDataState 方法看了底层发现没有双卡实现,目前也不知道该咋办...
未完待续....
PHP开发框架
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
手机客户端
ThinkSAAS接收任何功能的Iphone(IOS)和Android手机的客户端定制开发服务
让ThinkSAAS更好,把建议拿来。Android能够获取到唯一的设备ID吗_百度知道
Android能够获取到唯一的设备ID吗
Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID。例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID。在本文档结尾处提供了作为参考的示例代码片段。范围本文提供有关如何读取各种Android设备的 ID的介绍,用以使用标识号。本文假定用户已经安装了Android以及开发应用程序必要的工具。并且,本文假定用户已了解Android的基本知识。简介在搭载Android操作系统的设备中,已经存在好几种类型的设备标识号。先前的所有Android设备都具有电话功能,因此查找每部设备硬件唯一的IMEI,MEID,或ESN也很容易。但仅能使用Wifi的设备或音乐播放器没有电话硬件,所以没有这种类型的唯一标识号。本文阐述了如何读取不同Android设备的标识号。检索Android设备ID各种方式以下是Android设备不同类型的识别设备ID。· 唯一编号(IMEI,MEID,ESN,IMSI)· MAC地址· 序列号· ANDROID_ID唯一编号(IMEI,MEID,ESN,IMSI)说明在以前,当Android设备均作为电话使用时,寻找唯一标识号比较简单:()可用于找到(取决于网络技术)手机硬件唯一的IMEI,MEID,ESN和IMSI编号。TelephonyManager.getDeviceIdIMEI,MEID,ESN,IMSI的定义如下:•IMEI(国际移动设备识别码)唯一编号,用于识别 GSM,WCDMA手机以及一些卫星电话(移动设备识别码)全球唯一编号,用于识别CDMA移动电台设备的物理硬件,MEID出现的目的是取代ESN号段(电子序列号)(电子序列号)唯一编号,用于识别CDMA手机(国际移动用户识别码)与所有GSM和UMTS网络手机用户相关联的唯一识别编号如需要检索设备的ID,在项目中要使用以下代码:•MEID•ESN•IMSIimport android.telephony.TelephonyM
import android.content.C
imeistring =
imsistring =
TelephonyManager
telephonyM
telephonyManager =
( TelephonyManager )getSystemService( Context.TELEPHONY_SERVICE );
* getDeviceId() function Returns the unique device ID.
* for example,the IMEI for GSM and the MEID or ESN for CDMA phones.
imeistring = telephonyManager.getDeviceId();
* getSubscriberId() function Returns the unique subscriber ID,
* for example, the IMSI for a GSM phone.
imsistring = telephonyManager.getSubscriberId();
如要只读取手机的状态,则需添加READ_PHONE_STATE许可到AndroidManifest.xml文件中。&uses-permission android:name=&android.permission.READ_PHONE_ST缺点•Android设备要具有电话功能•其工作不是很可靠•序列号•当其工作时,该值保留了设备的重置信息(“恢复出厂设置”),从而可以消除当客户删除自己设备上的信息,并把设备转另一个人时发生的错误。Mac地址说明可通过检索找到设备的Wi - Fi或蓝牙硬件的Mac地址。但是,不推荐使用Mac地址作为唯一的标识号。缺点设备要具备Wi – Fi功能(并非所有的设备都有Wi – Fi功能)如果设备目前正在使用Wi - Fi,则不能报告Mac地址序列号从Android 2.3(“姜饼”)开始,通过android.os.Build.SERIAL方法序列号可被使用。没有电话功能的设备也都需要上给出唯一的设备ID; 某些手机也可以需要这样做。序列号可以用于识别MID(移动互联网设备)或PMP(便携式媒体播放器),这两种设备都没有电话功能。通过读取系统属性值“ro.serialno”的方法,可以使用序列号作为设备ID 。import java.lang.reflect.M
String serialnum =
Class&?& c = Class.forName(&android.os.SystemProperties&);
Method get = c.getMethod(&get&, String.class, String.class );
serialnum = (String)(
get.invoke(c, &ro.serialno&, &unknown& )
catch (Exception ignored)
缺点序列号无法在所有Android设备上使用。ANDROID_ID说明更具体地说,Settings.Secure.ANDROID_ID 是一串64位的编码(十六进制的字符串),是随机生成的设备的第一个引导,其记录着一个固定值,通过它可以知道设备的寿命(在设备恢复出厂设置后,该值可能会改变)。 ANDROID_ID也可视为作为唯一设备标识号的一个好选择。如要检索用于设备ID 的ANDROID_ID,请参阅下面的示例代码String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
其他类似问题
为您推荐:
telephonyManager = ( TelephonyManager )getSystemService( Context,MEID.TELEPHONY_SERVICE ),ESN,唯一编号有很多种(IMEI; imeistring = telephonyManager.getDeviceId()可以,IMSI) 比如
拨号盘输入*#06#
android的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Android 手机常见问答
什么是APK?
APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或
Android手机中执行即可安装。
扩展阅读:APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。
APK 文件的结构是什么?
一个APK文件结构为:
META-INF\ Jar文件中常可以看到
res\ 存放资源文件的目录
AndroidManifest.xml 程序全局配置文件
classes.dex Dalvik字节码
resources.arsc 编译后的二进制资源文件
总结下我们发现Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接,和Windows Mobile中的PE文件有区别,这样做对于程序的保密性和可靠性不是很高,通过dexdump命令可以反编译,但这样做符合发展规律,微软的 Windows Gadgets或者说WPF也采用了这种构架方式。
在Android平台中dalvik vm的执行文件被打包为apk格式,最终运行时加载器会解压然后获取编译后的androidmanifest.xml文件中的permission分支相关的安全访问,但仍然存在很多安全限制,如果你将apk文件传到/system/app文件夹下会发现执行是不受限制的。最终我们平时安装的文件可能不是这个文件夹,而在android rom中系统的apk文件默认会放入这个文件夹,它们拥有着root权限。
META-INF目录
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个api包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在OPhone平台上安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk 包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。
classes.dex文件
classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。
Android模拟器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器,把要查看的dex文件用 adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。
在About phone里有非常详细的手机各种版本状态的信息以下是各个栏目的功能介绍:
Status:包含有手机的基本信息,包括IMEI码、手机序列号、剩余电量等等。
Legal information:HTC、系统开源及谷歌的一些基本介绍。
Contributors:G1的一些赞助商、制造商、制作人员的一些介绍。
Model number:这里显示的是手机的型号。例如T-Mobile G1
Firmware version:Android系统的固件版本。在未来的固件升级中会经常遇到的。
Baseband version:G1的Baseband版本,和固件有关系。每次固件的升级,Baseband都会不同,这会在未来的固件升级中体现出啦的。
Kernel version:是Android内核版本。
Build number:这是谷歌内部版本控制信息。
如何查看IMEI?
答:在拨号处输入*#06#,即会出现IMEI码扩展回答:
在About phone里有非常详细的手机各种版本状态的信息,其中Status里的各个栏目的功能介绍如下:
Battery status:电池充电/未充电状态
Battery level:电池剩余电量
Phone number:手机序列号
Network:所处的移动网络
Signal strength:信号度
Network type:网络制式
Service state:所在服务区
Roaming:漫游/未漫游
Data access:共访问的数据大小
IMEI:IMEI码
IMEI SV:IMEI码的版本
IMSI:国际移动用户识别码
Mac address:手机无线Wi-Fi网络的Mac地址。
Bluetooth address:蓝牙地址
Up time:正常运行时间
Awake Time:手机唤醒时间android 代码获取IMEI,IMSI都为空,怎么解决?_百度知道
android 代码获取IMEI,IMSI都为空,怎么解决?
telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);IMSI = telephonyManager.getSubscriberId();IMEI = telephonyManager.getDeviceId()旦激测刻爻灸诧熏超抹;权限也都加了,获取还是空。备注:手机为三星 Galaxy I9100
-----------------------------------------------------------------------------日
19:35解旦激测刻爻灸诧熏超抹决了。原因是手机上装了360手机卫士,禁止了“获取该应用获取设备信息”,改为“允许”即可正常获取IMEI、IMSI
我有更好的答案
* 返回手机串号
*/ public Stri旦激测刻爻灸诧熏超抹ng getIMEI() {
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
return telephonyManager.getDeviceId(); } 我这样取是没有问题的
看我提问里写的代码也是这样,就是获取不到的,一直为空。谢谢。
那估计是你的权限加得不正确,或者加的位置不正确
其他类似问题
为您推荐:
imsi的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Android中获取IMEI码的方法
字体:[ ] 类型:转载 时间:
本篇文章是对在Android中获取IMEI码的方法进行了详细的分析介绍,需要的朋友参考下
核心代码:Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId();1.加入权限在manifest.xml文件中要添加 &uses-permission android:name="android.permission.READ_PHONE_STATE" /&2.代码
代码如下:package net.sunniwell.&&&& import android.app.A&&&& import android.os.B&&&& import android.telephony.CellL&&&& import android.telephony.PhoneStateL&&&& import android.telephony.TelephonyM&&&& public class TelManager extends Activity {&&&& @Override&&& protected void onCreate(Bundle savedInstanceState) {&&&& & super.onCreate(savedInstanceState);&&&& & TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);&&&& & /*&& && * 电话状态:&& && * 1.tm.CALL_STATE_IDLE=0&&&&&&&&& 无活动&& && * 2.tm.CALL_STATE_RINGING=1& 响铃&& && * 3.tm.CALL_STATE_OFFHOOK=2& 摘机&& && */&&& & tm.getCallState();//int&&&& & /*&& && * 电话方位:&& && *&&& && */&&& & tm.getCellLocation();//CellLocation&&&& & /*&& && * 唯一的设备ID:&& && * GSM手机的 IMEI 和 CDMA手机的 MEID.&&& && * Return null if device ID is not available.&& && */&&& & tm.getDeviceId();//String&&&& & /*&& && * 设备的软件版本号:&& && * 例如:the IMEI/SV(software version) for GSM phones.&& && * Return null if the software version is not available.&&& && */&&& & tm.getDeviceSoftwareVersion();//String&&&& & /*&& && * 手机号:&& && * GSM手机的 MSISDN.&& && * Return null if it is unavailable.&&& && */&&& & tm.getLine1Number();//String&&&& & /*&& && * 附近的电话的信息:&& && * 类型:List&NeighboringCellInfo&&&& && * 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES&& && */&&& & tm.getNeighboringCellInfo();//List&NeighboringCellInfo&&&&& & /*&& && * 获取ISO标准的国家码,即国际长途区号。&& && * 注意:仅当用户已在网络注册后有效。&& && *&&&&&& 在CDMA网络中结果也许不可靠。&& && */&&& & tm.getNetworkCountryIso();//String&&&& & /*&& && * MCC+MNC(mobile country code + mobile network code)&& && * 注意:仅当用户已在网络注册时有效。&& && *&&& 在CDMA网络中结果也许不可靠。&& && */&&& & tm.getNetworkOperator();//String&&&& & /*&& && * 按照字母次序的current registered operator(当前已注册的用户)的名字&& && * 注意:仅当用户已在网络注册时有效。&& && *&&& 在CDMA网络中结果也许不可靠。&& && */&&& & tm.getNetworkOperatorName();//String&&&& & /*&& && * 当前使用的网络类型:&& && * 例如: NETWORK_TYPE_UNKNOWN& 网络类型未知& 0&& &&&& NETWORK_TYPE_GPRS&&&& GPRS网络& 1&& &&&& NETWORK_TYPE_EDGE&&&& EDGE网络& 2&& &&&& NETWORK_TYPE_UMTS&&&& UMTS网络& 3&& &&&& NETWORK_TYPE_HSDPA&&& HSDPA网络& 8&&& &&&& NETWORK_TYPE_HSUPA&&& HSUPA网络& 9&& &&&& NETWORK_TYPE_HSPA&&&& HSPA网络& 10&& &&&& NETWORK_TYPE_CDMA&&&& CDMA网络,IS95A 或 IS95B.& 4&& &&&& NETWORK_TYPE_EVDO_0&& EVDO网络, revision 0.& 5&& &&&& NETWORK_TYPE_EVDO_A&& EVDO网络, revision A.& 6&& &&&& NETWORK_TYPE_1xRTT&&& 1xRTT网络& 7&& && */&&& & tm.getNetworkType();//int&&&& & /*&& && * 手机类型:&& && * 例如: PHONE_TYPE_NONE& 无信号&& &&&& PHONE_TYPE_GSM&& GSM信号&& &&&& PHONE_TYPE_CDMA& CDMA信号&& && */&&& & tm.getPhoneType();//int&&&& & /*&& && * Returns the ISO country code equivalent for the SIM provider's country code.&& && * 获取ISO国家码,相当于提供SIM卡的国家码。&& && *&&& && */&&& & tm.getSimCountryIso();//String&&&& & /*&& && * Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM. 5 or 6 decimal digits.&& && * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.&& && * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).&& && */&&& & tm.getSimOperator();//String&&&& & /*&& && * 服务商名称:&& && * 例如:中国移动、联通&& && * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).&& && */&&& & tm.getSimOperatorName();//String&&&& & /*&& && * SIM卡的序列号:&& && * 需要权限:READ_PHONE_STATE&& && */&&& & tm.getSimSerialNumber();//String&&&& & /*&& && * SIM的状态信息:&& && *& SIM_STATE_UNKNOWN&&&&&&&&& 未知状态 0&& && SIM_STATE_ABSENT&&&&&&&&&& 没插卡 1&& && SIM_STATE_PIN_REQUIRED&&&& 锁定状态,需要用户的PIN码解锁 2&& && SIM_STATE_PUK_REQUIRED&&&& 锁定状态,需要用户的PUK码解锁 3&& && SIM_STATE_NETWORK_LOCKED&& 锁定状态,需要网络的PIN码解锁 4&& && SIM_STATE_READY&&&&&&&&&&& 就绪状态 5&& && */&&& & tm.getSimState();//int&&&& & /*&& && * 唯一的用户ID:&& && * 例如:IMSI(国际移动用户识别码) for a GSM phone.&& && * 需要权限:READ_PHONE_STATE&& && */&&& & tm.getSubscriberId();//String&&&& & /*&& && * 取得和语音邮件相关的标签,即为识别符&& && * 需要权限:READ_PHONE_STATE&& && */&&& & tm.getVoiceMailAlphaTag();//String&&&& & /*&& && * 获取语音邮件号码:&& && * 需要权限:READ_PHONE_STATE&& && */&&& & tm.getVoiceMailNumber();//String&&&& & /*&& && * ICC卡是否存在&& && */&&& & tm.hasIccCard();//boolean&&&& & /*&& && * 是否漫游:&& && * (在GSM用途下)&& && */&&& & tm.isNetworkRoaming();//&&&& &&&&&& }&&&& &&& }&&
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 imei和imsi的区别 的文章

 

随机推荐