- 浏览: 911198 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
android公开的API提供了访问方法,大家都知道使用TelephonyManager提供的方法,但是有些理解有误,如下国内一个比较大的andorid论坛提供的例子,就出现了错误:
帖子如下http://www.eoeandroid.com/thread-14027-1-3.html,其中实现代码没有注释,只能按照变量定义判断:
- TelephonyManager tm = (TelephonyManager) this .getSystemService(Context.TELEPHONY_SERVICE);
- String deviceid = tm.getDeviceId();
- String tel = tm.getLine1Number(); //取出用户手机号码,我加的
- String imei =tm.getSimSerialNumber(); //取出IMEI,我加的
- String imsi =tm.getSubscriberId(); //取出IMSI,我加的
那么上述出现错误了:String imei =tm.getSimSerialNumber(); //取出IMEI
IMEI是手机的序列号,怎么会通过getSimSerialNumber()方法获得,那么查一下andorid源码可以看出:
http://www.netmite.com/android/mydroid/frameworks/base/telephony/java/android/telephony/TelephonyManager.java
从注释里明显看出来这个函数是取SIM卡序列号的,也就是ICCID的,他用错了。
- /**
- * Returns the serial number of the SIM, if applicable.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- */
- public String getSimSerialNumber() {
- try {
- return getSubscriberInfo().getSimSerialNumber();
- } catch (RemoteException ex) {
- }
- return null ;
- }
2.相关几个定义、说明:
我们说到的和手机、卡相关的号码数据包括IMSI,MSISDN,ICCID,IMEI
IMSI:international mobiles subscriber identity国际移动用户号码标识,这个一般大家是不知道,GSM必须写在卡内相关文件中;
MSISDN:mobile subscriber ISDN用户号码,这个是我们说的139,136那个号码;
ICCID:ICC identity集成电路卡标识,这个是唯一标识一张卡片物理号码的;
IMEI:international mobile Equipment identity手机唯一标识码;
3.那好我们看看andorid实现TelephonyManager.java的源码:
getDeviceId()取IMEI号没有争议了。
- /**
- * Returns the unique device ID, for example,the IMEI for GSM
- * phones.
- *
- * <p>Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- */
- public String getDeviceId() {
- try {
- return getSubscriberInfo().getDeviceId();
- } catch (RemoteException ex) {
- }
- return null ;
- }
getLine1Number()取MSISDN,这个需要说明两点
1) 为什么这个函数叫getLine1Number(),因为andorid实现的时候应该分为GSM和CDMA的,GSM手机使用这个函数,CDMA应该还会由其它实现的。
2) 取MSISDN具体的方法就会导致最后能否取到了,函数中调用了getSubscriberInfo().getLine1Number()去实现,我们下面找找看。
- /**
- * Returns the phone number string for line 1, for example, the MSISDN
- * for a GSM phone.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- */
- public String getLine1Number() {
- try {
- return getSubscriberInfo().getLine1Number();
- } catch (RemoteException ex) {
- }
- return null ;
- }
- // 找到了
- private IPhoneSubInfo getSubscriberInfo() {
- // get it each time because that process crashes a lot
- return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService( "iphonesubinfo" ));
- }
- // 一个接口,再找有一个PhoneSubInfo.java:
- /**
- * Retrieves the unique device ID, e.g., IMEI for GSM phones and MEID for CDMA phones.
- */
- public String getDeviceId() {
- mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE" );
- return mPhone.getDeviceId();
- }
- //前面定义了Phone mPhone,再找Phone.java:
- /**
- * Retrieves the unique sbuscriber ID, e.g., IMSI for GSM phones.
- */
- String getSubscriberId();
- //原来是个接口,发现PhoneProxy.java有具体实现
- public String getSubscriberId() {
- return mActivePhone.getSubscriberId();
- }
- // 这个mActivePhone是phone的实例,我疯了,于是发现GSMPHONE。java中有了具体实现:
- public String getSubscriberId() {
- return mSIMRecords.imsi;
- }
- public String getIccSerialNumber() {
- return mSIMRecords.iccid;
- }
- public String getLine1Number()
- {
- return mSIMRecords.getMsisdnNumber();
- }
从上面看出来,应该是通过SIM卡相关文件记录得到的上述数据,从其中看到:
public void handleMessage(Message msg) 这个函数进行了真正的处理,重点看:
- case EVENT_GET_MSISDN_DONE:
- isRecordLoadResponse = true ;
- ar = (AsyncResult)msg.obj;
- if (ar.exception != null ) {
- Log.d(LOG_TAG, "Invalid or missing EF[MSISDN]" ); //应该是从sim卡的EFmsisdn文件中取出来的
- break ;
- }
- adn = (AdnRecord)ar.result;
- msisdn = adn.getNumber();
- msisdnTag = adn.getAlphaTag();
- Log.d(LOG_TAG, "MSISDN: " + msisdn);
- break ;
下面的细节就不分析了,那个问题就归结到是否可以从SIM卡的EFmsisdn文件取出手机号码了,不幸的是一般运营商不会把用户号码写在这个文件的,为什么呢?
因为这个手机号码是在用户买到卡并开通时才将IMSI和MSISDN对应上的,卡内生产出来时只有IMSI,你不知道用户喜欢那个手机号码,因此一般不先对应IMSI和MSISDN,即时有对应也不写这个文件的。
4 总结
TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId(); //取出IMEI
String tel = tm.getLine1Number(); //取出MSISDN,很可能为空
String imei =tm.getSimSerialNumber(); //取出ICCID
String imsi =tm.getSubscriberId(); //取出IMSI
发表评论
-
Android systrace
2018-09-12 11:13 974Understanding Systrace Caution: ... -
Android simpleperf
2018-09-12 11:02 1672Introduction of simpleperf What ... -
Android selinux安全策略
2016-06-21 17:16 3993基础知识 SEAndroid在架构和机制上与SELinux完 ... -
Android wifi captive portal 验证
2016-02-23 20:38 5087只要是国内的用户,基本上刷完5.0版本后如果没挂上V P N, ... -
Android CTS windows环境下测试
2015-09-08 11:36 6404Windows下CTS测试步骤 1.获 ... -
Android 之 日期时间 时区同步
2015-05-13 15:47 6282系统设置--日期和时间-- ... -
虚拟按键 振动效果
2015-05-12 11:50 2055[DESCRIPTION] Setting->情景模式- ... -
Android 签名信息读取
2014-08-22 17:32 1325public void getSingInfo() { ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 9861一、一个BUG引发的问题 ... -
Android 多语言 多地区对应表
2014-05-13 17:09 2042Arabic, Egypt (ar_EG) Arabic, ... -
Android emulated sdcard
2013-08-12 21:46 6083如果要添加 emulated sdcard ,需要一下几个 ... -
#if、#ifdef、#if defined之间的区别
2013-05-17 15:19 58374#if的使用说明 #if的后面接的是表达式 #if ( ... -
Android 动态库死机调试方法
2013-03-05 13:54 4827android系统中调试Java非常容易,一般遇到错误都在 ... -
Android sqlite3 详解
2012-09-13 22:13 2354SQLite库包含一个名字叫做sqlite3的命令行,它可以让 ... -
Android 多语言开发
2012-08-16 18:37 2304第一部分 多语言定制的机制 1、ICU4C简介 ICU4 ... -
Android 添加底层核心服务
2012-06-04 10:52 5718为 Android添加底层核 ... -
Android 之响应的系统设置的事件
2012-05-24 18:17 19171、Configuration类专门用于描述手机设备上的配置信 ... -
Android CRT Screen 电视效果
2012-05-17 11:12 2245Android 2.3 对关屏进行了优化,增加了一种类似于 ... -
android编译dex-preopt
2012-05-11 18:48 5352对于android2.3编译时候选择下面的情况,既可以对dex ... -
Android 移动终端camera 防偷*拍设置
2012-04-26 10:35 1824目前市面上的所有移动终端几乎都有camera应用,但andro ...
相关推荐
简单的DEMO 用于查看Android手机的IMEI IMSI
android 显示手机号码,手机imei imsi 手机设备号,android 显示手机号码,手机imei imsi 手机设备号
android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
Android 读取IMSI 和IMEI号支持双卡双待,可以判断双卡双待通过那个卡上网,及读取双卡双待的电话卡的信息
如何修改Android模拟器的IMSI,简单方法。
Windows Mobile和Android获得IMEI、MEID和IMSI demo Windows Mobile是从别处拿来的, sim5.rar是IMEI、MEID和IMSI demo CallGetDeviceUniqueId是获取window mobile系统UID的另一个方式 Android很浅显,一起共享吧
读取android设备上主卡和副卡的imsi。经测试大部分机型都能正常获取到,如小米等国产机
VC++编写的手机设备信息读取,包括IMEI IMSI 设备ID
Android-Android-IMSI-Catcher-Detector.zip,艾姆西德•与艾姆西捕手,黄貂鱼和无声短信战斗!,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全...
android 获取手机上面的IMSI序列号、IMEI、MAC地址、IP地址、当前时间、当前经纬度、获取网络类型
获取手机硬件号(如 IMEI IMSI 号等)
如標題同 Windows Mobile 取得 IMEI、IMSI
基于Android10.0的设备上,获取相应的MAC地址,手机IMEI号,手机号,手机MSISDN号,手机ICCID号,进行可行性验证,特别是MAC地址方面,在Android10.0前后的设备均进行相应的接口验证,保证其可用性。适合正在致力于...
c#获取mobile手机的IMEI和IMSI!
Windows Mobile 开发获取手机IMSI码和IMEI码
WinCE 获取PDA的SIM卡号和设备序列号
Android应用程序,安装在手机后,轻松获取imsi号码,方便开发和测试人员使用。
WIndow mobile 6.0 以上 获取IMSI和IMEI.rar
主要介绍了使用Objective-C获取IPHONE手机IMSI序列号的方法以及通过IMSI序列号获取运营商、手机号的方法,非常的实用,有需要的小伙伴可以参考下。
Android-IMSI-Catcher-Detector 是一个基于安卓的项目,它能在 GSM/UMTS 网络中侦测并避开假冒基站(IMSI 捕捉器)。 标签:Android