- 浏览: 923732 次
- 性别:
- 来自: 上海
最新评论
-
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 1035Understanding Systrace Caution: ... -
Android simpleperf
2018-09-12 11:02 1947Introduction of simpleperf What ... -
Android selinux安全策略
2016-06-21 17:16 4108基础知识 SEAndroid在架构和机制上与SELinux完 ... -
Android wifi captive portal 验证
2016-02-23 20:38 5197只要是国内的用户,基本上刷完5.0版本后如果没挂上V P N, ... -
Android CTS windows环境下测试
2015-09-08 11:36 6456Windows下CTS测试步骤 1.获 ... -
Android 之 日期时间 时区同步
2015-05-13 15:47 6369系统设置--日期和时间-- ... -
虚拟按键 振动效果
2015-05-12 11:50 2124[DESCRIPTION] Setting->情景模式- ... -
Android 签名信息读取
2014-08-22 17:32 1381public void getSingInfo() { ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 9993一、一个BUG引发的问题 ... -
Android 多语言 多地区对应表
2014-05-13 17:09 2147Arabic, Egypt (ar_EG) Arabic, ... -
Android emulated sdcard
2013-08-12 21:46 6170如果要添加 emulated sdcard ,需要一下几个 ... -
#if、#ifdef、#if defined之间的区别
2013-05-17 15:19 58471#if的使用说明 #if的后面接的是表达式 #if ( ... -
Android 动态库死机调试方法
2013-03-05 13:54 4873android系统中调试Java非常容易,一般遇到错误都在 ... -
Android sqlite3 详解
2012-09-13 22:13 2406SQLite库包含一个名字叫做sqlite3的命令行,它可以让 ... -
Android 多语言开发
2012-08-16 18:37 2401第一部分 多语言定制的机制 1、ICU4C简介 ICU4 ... -
Android 添加底层核心服务
2012-06-04 10:52 5810为 Android添加底层核 ... -
Android 之响应的系统设置的事件
2012-05-24 18:17 19771、Configuration类专门用于描述手机设备上的配置信 ... -
Android CRT Screen 电视效果
2012-05-17 11:12 2300Android 2.3 对关屏进行了优化,增加了一种类似于 ... -
android编译dex-preopt
2012-05-11 18:48 5441对于android2.3编译时候选择下面的情况,既可以对dex ... -
Android 移动终端camera 防偷*拍设置
2012-04-26 10:35 1892目前市面上的所有移动终端几乎都有camera应用,但andro ...
相关推荐
在Android系统中,IMEI(International Mobile Equipment Identity)和IMSI(International Mobile Subscriber Identity)是两个重要的标识符,它们在移动通信中起着至关重要的作用。IMEI是设备的唯一标识,而IMSI则...
Android 平台获取手机 IMSI、IMEI、序列号和手机号的方法 Android 操作系统提供了多种方法来获取手机的 IMSI、IMEI、序列号和手机号,这些信息对于移动应用程序的开发和维护非常重要。本文将详细介绍 Android 平台...
访问IMSI和IMEI通常需要`READ_PHONE_STATE`权限,而获取所有SIM卡信息可能需要更高的权限,如在Android N及以上版本需要`ACCESS_ALL_PHONE_STATE`。同时,获取网络连接状态可能需要`ACCESS_FINE_LOCATION`或`ACCESS_...
如何修改Android模拟器的IMSI,简单方法。
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> ``` 这个权限允许应用访问电话状态,包括SIM卡信息。 接下来,Android提供了`TelephonyManager`类来处理与手机通信相关的任务,其中包括...
在Android系统中,获取和显示手机号码、IMEI(国际移动设备识别码)以及IMSI(国际移动用户识别码)是常见的需求,这些信息对于设备管理和应用开发具有重要作用。下面将详细阐述这些概念以及如何在Android中获取它们...
在C#中获取IMEI主要针对Windows Phone和使用Xamarin或.NET MAUI的Android平台,而获取IMSI则涉及更高级别的权限和隐私考虑,一般不推荐直接获取。在实际应用中,应遵循最小权限原则,尊重并保护用户隐私。同时,注意...
Windows Mobile和Android获得IMEI、MEID和IMSI demo Windows Mobile是从别处拿来的, sim5.rar是IMEI、MEID和IMSI demo CallGetDeviceUniqueId是获取window mobile系统UID的另一个方式 Android很浅显,一起共享吧
在移动通信领域,IMEI(国际移动设备识别码)和IMSI(国际移动用户标识)是两个关键的概念,用于唯一地标识每一台手机设备和移动网络中的用户身份。本文将详细探讨如何使用VC++编程语言来读取这些信息。 IMEI是每个...
本文将详细介绍如何在Android应用中获取IMSI(国际移动用户识别码)、IMEI(国际移动设备识别码)、MAC地址、IP地址、当前时间、经纬度以及网络类型。 首先,让我们了解这些概念: 1. **IMSI**:IMSI是手机用户在...
Android平台获取手机IMSI、IMEI、序列号及手机号的用法 在 Android 平台中,获取手机的 IMSI、IMEI、序列号及手机号是非常重要的,以下将详细介绍如何获取这些信息。 1. 获取运营商 SIM 卡 IMSI 号 使用 `android...
Android-Android-IMSI-Catcher-Detector.zip,艾姆西德•与艾姆西捕手,黄貂鱼和无声短信战斗!,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全...
在Windows CE(WinCE)操作系统环境下,IMEI(国际移动设备识别码)和IMSI(国际移动用户识别码)是两个关键的标识符,用于唯一地识别移动通信设备和其对应的用户。IMEI通常用于追踪和识别手机,而IMSI是SIM卡上的...
综上所述,"Read IMEI from Android phone"这一主题涵盖了Android权限管理、系统API使用、数据安全、设备识别等多个方面的知识,是Android开发中的一个重要环节。正确理解和运用这些知识点,可以帮助开发者构建出更...
在IT行业中,IMEI(International Mobile Equipment Identity)和IMSI(International Mobile Subscriber Identity)是两个非常重要的概念,尤其是在移动通信领域。IMEI是设备的唯一标识符,而IMSI则是用户的唯一...
对于支持双SIM卡的设备,`TelephonyManager`提供了`getSimSerialNumber()`方法获取SIM卡的IMSI(国际移动用户识别码),但并不是IMEI。要获取IMEI,可以调用`getDeviceId(int subscriptionId)`,其中`...
在移动通信领域,IMSI(International Mobile Subscriber Identity)和IMEI(International Mobile Equipment Identity)是两个非常关键的概念,尤其在Windows Mobile开发中,理解和利用这两个标识符对于开发针对...
在Windows Mobile操作系统中,IMEI(国际移动设备识别码)和IMSI(国际移动用户识别码)是两个非常重要的概念,它们与移动通信设备的身份标识紧密相关。IMEI是每台GSM(全球系统移动通信)和UMTS(通用分组无线业务...
Android应用程序,安装在手机后,轻松获取imsi号码,方便开发和测试人员使用。
在IT行业中,尤其是在移动开发领域,IMEI(国际移动设备识别码)和IMSI(国际移动用户识别码)是两个非常关键的概念。IMEI主要用于唯一标识一部手机,而IMSI则是用于识别移动网络中的特定用户。本文将深入探讨如何在...