关于android读取用户号码,手机串号,SIM卡序列号
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,IMEIIMSI: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读取用户号码,手机串号,SIM卡序列号相关推荐
- 84.android 简单的(双卡手机)指定某个SIM卡拨打电话
//第一步 权限: <uses-permission android:name="android.permission.CALL_PHONE" /> //Activit ...
- 读取imei手机串号
转自:http://blog.sina.com.cn/s/blog_60a9446b0100lxuk.html /*** 读取imei手机串号*/TelephonyManager mTelephony ...
- iPhone手机 手机设备号和手机串号imsi
经过调研,代码实现获取iPhone手机串号是获取不到的,网上提供的一些获取手机串号都是通过第三方库来写的,使用这些库的app在app store是审核不了的,所以目前还没有办法获取手机串号imsi的. ...
- 获取手机串号 版本 品牌
判断用户是否开启某个服务 public static boolean serviceIsStart(Context cont, String className) {ActivityManager m ...
- iPhone手机 手机设备号和手机串号imsi
经过调研,代码实现获取iPhone手机串号是获取不到的,网上提供的一些获取手机串号都是通过第三方库来写的,使用这些库的app在app store是审核不了的,所以目前还没有办法获取手机串号imsi的. ...
- 手机串号英文简称“IMEI”
手机串号英文简称"IMEI",存储在手机的EEPROM(俗称码片)里,每一个移动设备都对应一个唯一的IMEI.其组成结构为TAC(6位数字)+FAC(两位数字)+SNR(6位数字) ...
- 如何在Java ME平台上获取手机串号IMMI
注意:在Java ME平台上获取手机串号,在某些手机中是可行的,但是某些手机中就是无法获取的.对于即便是可以获取串号的手机来说,也仅仅限于进行了签名的应用程序才可以获得手机串号. 在诺基亚手机中,我们 ...
- IMEI码查询[*#06#-手机串号查询]--你的手机到底是翻新机还是正品行货
在对手机串号研究时候,找到了一个一家通过手机串号来查询你的手机具体信息的网站,现在把这个网站拿出来和大家分享.以后各位朋友们无论是买行货还是水货,新机还是二手,都可以通过这个网站来查询一下,至少可以知 ...
- 手机串号IMEI的国际查询网站及说明
手机串号IMEI的国际查询网站及说明 IMEI 为TAC + FAC + SNR + SP.IMEI(International Mobile Equipment Identity)是"国际 ...
最新文章
- 【闲聊产品】之五:谁来背黑锅?
- iView 近期的更新,以及那些“不为人知”的故事
- java 字符串构造函数,java构造函数示例(构造方法)
- c语言形参指针 实参数组,《C语言程序设计》中的指针形参和函数体中数组实参问题的教学研究.pdf...
- java实现泛型检索_高级Java泛型:检索泛型类型参数
- Atitit 设计模式与算法,与流程的关系
- 在Anylogic建立自己的智能体
- 获得各城市区号JS代码
- AVX2指令集浮点乘法性能分析
- Ipv6地址与Ipv6 Cidr合法性校验
- pandas 数据类型之 DataFrame
- 一个简单的音乐播放器(实现上一曲下一曲,和自动播放)
- 《英语阅读教学与思维发展》读书笔记(三)
- IDEA 运行时出现 too long 异常
- Semantic Proximity Search on Heterogeneous Graph by Proximity Embedding
- 分享一些ABP..ABS的广告过滤规则
- QT起一个线程实时监测某个进程是否正常运行
- ❤️数据结构之栈(图文版详解)❤️
- IOS (不越狱)网络抓包
- 基于 python 的单细胞转录因子分析
热门文章
- 算法原理系列:红黑树
- 计算机具有理性和逻辑思维吗,我们的理性和逻辑思维能力真的有那么重要吗?...
- 设计分享|基于51单片机的数字时钟(汇编)
- 共轭对称序列和共轭反对称序列
- JWT、JWE、JWS 、JWK 到底是什么?该用 JWT 还是 JWS?
- 最近玩喂喂我的小仓鼠吧,玩上瘾了……
- Warshall沃舍尔算法
- ye321片库_jQuery的简约幻灯片库
- PHP导入Excel文件后缀xlsx与xls的处理问题
- 分解成质因数(如435234=251*17*17*3*2