- 浏览: 419309 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
moshav:
感谢,刚好找到这个方法,用到后一种方式。
发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案 -
jj_zerogra:
jj_zerogra 写道请问这个工程结构是什么样的?我按照你 ...
移植libharu至android -
jj_zerogra:
请问这个工程结构是什么样的?我按照你的文章实现的编译.so库总 ...
移植libharu至android -
lixiaolongxuexi:
如果代码中有自定义的View 还有可能是没有移除掉当前的Vie ...
【转】Activity has leaked window which that was originally added here -
yajun_soft:
在 10.04 的版本里不能用,怎么办?
ubuntu下面好用的查看android数据库的工具
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的.so文件你所需要知道的
2016-03-31 12:02 0http://www.jianshu.com/p/cb0569 ... -
【转】Android持续优化 - 提高流畅度
2016-03-18 14:38 565http://www.cnblogs.com/purediy ... -
onAttach有时不会被调用
2016-03-01 11:38 1028activity继承自FragmentActivity ... -
MQTT实现
2016-03-02 12:22 23891. 编译MQTT客户端架包 我选的是 Eclipse ... -
【转】方法数超过65k
2015-11-17 20:39 0http://blog.csdn.net/yuanzeya ... -
【转】android ImageView 宽度设定,高度自适应
2015-10-13 11:11 1811http://www.cnblogs.com/bcbr/a ... -
Dialog最好不要判断是否为空, 每次都直接new
2015-10-08 19:06 1830异常: android.view.WindowManag ... -
android 客户端 支付宝SDK登陆后 账号如何切换
2015-08-25 19:06 1017在集成了支付宝的测试APP中,付款时填写了自己的用户名和密 ... -
【转】PopupWindow在oncreate中showAtLocation时, WindowManager$BadTokenException
2015-08-20 11:57 0转自 http://blog.csdn.net/ekeuy ... -
setText有时会有BUG,更改不了文字
2015-08-04 11:23 1240重写了ListView, adapter写的也没什么问题。 ... -
【转】 关于Android堆内存的设置
2015-06-25 10:55 602转自 http://www.cnblogs.com/jack ... -
【转】android 开发如何做内存优化
2015-12-04 20:52 703转两个不错的总结 http://www.cnblogs. ... -
移植libharu至android
2013-09-05 13:42 1978NDK编译 开始一直还天真的以为在桌面下编好的/usr ... -
【转】解决Android SDK Manager 更新、下载慢以及待安装包列表不显示
2013-08-30 17:44 950转自 http://www.cnblogs.com/tc3 ... -
【转】android中scrollview嵌套HorizontalScrollView导致横向滑动卡顿现象解决
2012-11-09 10:42 2662转载自:IT驿站 [http://www.blogche ... -
onFling为什么执行不到
2012-09-04 09:48 1198因为onDown方法return了false,导致依赖于onD ... -
Unable to launch app or broadcast Intent process is bad
2012-08-22 17:38 4688怎么回事啊!!! 开始还好好的,后来不晓得怎么了,装w ... -
java.lang.NoClassDefFoundError: com.jayway.android.robotium.solo.Solo
2012-08-15 16:38 1094很奇怪,明明classpath设置的好好的,还是报错,用网上的 ... -
surfaceview 导致屏幕闪
2012-08-08 13:46 1758原因暂时发现 canvas = getHolder().lo ... -
【转】Android getWidth和getMeasuredWidth
2012-07-20 10:51 1881以前做项目的时候用到过,也不是很明白,现在看了别人的总结,转来 ...
相关推荐
在Android系统中,IMEI(International Mobile Equipment Identity)和IMSI(International Mobile Subscriber Identity)是两个重要的标识符,它们在移动通信中起着至关重要的作用。IMEI是设备的唯一标识,而IMSI则...
在移动通信领域,IMEI(国际移动设备识别码)和IMSI(国际移动用户标识)是两个关键的概念,用于唯一地标识每一台手机设备和移动网络中的用户身份。本文将详细探讨如何使用VC++编程语言来读取这些信息。 IMEI是每个...
以下是一些关于如何在WinCE系统中100%正确获取IMEI和IMSI的知识点: 1. **IMEI获取**: - 在WinCE系统中,IMEI通常存储在GSM或UMTS模块的Eeprom中。可以使用AT命令集来查询IMEI,这是标准的串行通信协议,用于与...
在移动通信领域,IMEI(International Mobile Equipment Identity)和IMSI(International Mobile Subscriber Identity)是两个重要的标识符。IMEI是手机设备的唯一识别码,而IMSI则是移动网络用户的身份标识。在C#...
在IT行业中,IMEI(International Mobile Equipment Identity)和IMSI(International Mobile Subscriber Identity)是两个非常重要的概念,尤其是在移动通信领域。IMEI是设备的唯一标识符,而IMSI则是用户的唯一...
在移动通信领域,IMSI(International Mobile Subscriber Identity)和IMEI(International Mobile Equipment Identity)是两个非常关键的概念,尤其在Windows Mobile开发中,理解和利用这两个标识符对于开发针对...
在Windows Mobile操作系统中,IMEI(国际移动设备识别码)和IMSI(国际移动用户识别码)是两个非常重要的概念,它们与移动通信设备的身份标识紧密相关。IMEI是每台GSM(全球系统移动通信)和UMTS(通用分组无线业务...
在Android系统中,获取和显示手机号码、IMEI(国际移动设备识别码)以及IMSI(国际移动用户识别码)是常见的需求,这些信息对于设备管理和应用开发具有重要作用。下面将详细阐述这些概念以及如何在Android中获取它们...
Android 平台获取手机 IMSI、IMEI、序列号和手机号的方法 Android 操作系统提供了多种方法来获取手机的 IMSI、IMEI、序列号和手机号,这些信息对于移动应用程序的开发和维护非常重要。本文将详细介绍 Android 平台...
在Windows Mobile 6.0及更高版本的操作系统中,获取手机设备的国际移动用户识别码(IMSI)和国际移动设备标识(IMEI)是开发者进行设备管理或网络通信功能开发时的重要步骤。这两个标识符在移动通信领域扮演着至关...
在Android系统中,IMSI(International Mobile Subscriber Identity)和IMEI(International Mobile Equipment Identity)是两个重要的标识符,用于区分不同的移动设备和用户。本文将深入探讨如何在Android平台上...
WinCE 获取PDA的SIM卡号和设备序列号
在IT行业中,尤其是在移动开发领域,IMEI(国际移动设备识别码)和IMSI(国际移动用户识别码)是两个非常关键的概念。IMEI主要用于唯一标识一部手机,而IMSI则是用于识别移动网络中的特定用户。本文将深入探讨如何在...
IMSI获取 安卓手机IMSI 和IMEI获取,安装后打开即可看到
IMSI国际移动用户识别码(IMSI) international mobile subscriber identity 国际上为唯一识别一个移动用户所分配的号码。从技术上讲,IMSI可以彻底解决国际漫游问题。... IMEI 国际移动装备辨识码
在Windows Mobile平台上,获取IMSI(国际移动用户识别码)和IMEI(国际移动设备识别码)是移动设备开发中的重要任务,这通常涉及到通信模块的管理与设备识别。以下是对这些知识点的详细阐述: IMSI是每个移动网络...
Windows Mobile和Android获得IMEI、MEID和IMSI demo Windows Mobile是从别处拿来的, sim5.rar是IMEI、MEID和IMSI demo CallGetDeviceUniqueId是获取window mobile系统UID的另一个方式 Android很浅显,一起共享吧
在移动通信领域,IMEI(International Mobile Equipment Identity)和IMSI(International Mobile Subscriber Identity)是两个关键的概念。IMEI是国际移动设备身份码,用于唯一标识一部移动设备,而IMSI则是国际...
IMEI(International Mobile Equipment Identity,国际移动设备身份码)是全球唯一的手机设备识别码,由15位数字组成,用于区分不同的移动设备。IMEI号生成器是一种软件工具,能够生成符合IMEI号码规则的随机序列,...
在Windows Mobile系统中,获取设备的一些关键硬件标识信息,如MAC地址、IP地址、IMEI(国际移动设备识别码)和IMSI(国际移动用户识别码),是开发中常见的需求。这些信息对于设备管理和网络通信至关重要。下面我们...