1.从一个错误代码引出我们的讨论:
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卡序列号相关推荐

  1. 84.android 简单的(双卡手机)指定某个SIM卡拨打电话

    //第一步 权限: <uses-permission android:name="android.permission.CALL_PHONE" /> //Activit ...

  2. 读取imei手机串号

    转自:http://blog.sina.com.cn/s/blog_60a9446b0100lxuk.html /*** 读取imei手机串号*/TelephonyManager mTelephony ...

  3. iPhone手机 手机设备号和手机串号imsi

    经过调研,代码实现获取iPhone手机串号是获取不到的,网上提供的一些获取手机串号都是通过第三方库来写的,使用这些库的app在app store是审核不了的,所以目前还没有办法获取手机串号imsi的. ...

  4. 获取手机串号 版本 品牌

    判断用户是否开启某个服务 public static boolean serviceIsStart(Context cont, String className) {ActivityManager m ...

  5. iPhone手机 手机设备号和手机串号imsi

    经过调研,代码实现获取iPhone手机串号是获取不到的,网上提供的一些获取手机串号都是通过第三方库来写的,使用这些库的app在app store是审核不了的,所以目前还没有办法获取手机串号imsi的. ...

  6. 手机串号英文简称“IMEI”

    手机串号英文简称"IMEI",存储在手机的EEPROM(俗称码片)里,每一个移动设备都对应一个唯一的IMEI.其组成结构为TAC(6位数字)+FAC(两位数字)+SNR(6位数字) ...

  7. 如何在Java ME平台上获取手机串号IMMI

    注意:在Java ME平台上获取手机串号,在某些手机中是可行的,但是某些手机中就是无法获取的.对于即便是可以获取串号的手机来说,也仅仅限于进行了签名的应用程序才可以获得手机串号. 在诺基亚手机中,我们 ...

  8. IMEI码查询[*#06#-手机串号查询]--你的手机到底是翻新机还是正品行货

    在对手机串号研究时候,找到了一个一家通过手机串号来查询你的手机具体信息的网站,现在把这个网站拿出来和大家分享.以后各位朋友们无论是买行货还是水货,新机还是二手,都可以通过这个网站来查询一下,至少可以知 ...

  9. 手机串号IMEI的国际查询网站及说明

    手机串号IMEI的国际查询网站及说明 IMEI 为TAC + FAC + SNR + SP.IMEI(International Mobile Equipment Identity)是"国际 ...

最新文章

  1. 【闲聊产品】之五:谁来背黑锅?
  2. iView 近期的更新,以及那些“不为人知”的故事
  3. java 字符串构造函数,java构造函数示例(构造方法)
  4. c语言形参指针 实参数组,《C语言程序设计》中的指针形参和函数体中数组实参问题的教学研究.pdf...
  5. java实现泛型检索_高级Java泛型:检索泛型类型参数
  6. Atitit 设计模式与算法,与流程的关系
  7. 在Anylogic建立自己的智能体
  8. 获得各城市区号JS代码
  9. AVX2指令集浮点乘法性能分析
  10. Ipv6地址与Ipv6 Cidr合法性校验
  11. pandas 数据类型之 DataFrame
  12. 一个简单的音乐播放器(实现上一曲下一曲,和自动播放)
  13. 《英语阅读教学与思维发展》读书笔记(三)
  14. IDEA 运行时出现 too long 异常
  15. Semantic Proximity Search on Heterogeneous Graph by Proximity Embedding
  16. 分享一些ABP..ABS的广告过滤规则
  17. QT起一个线程实时监测某个进程是否正常运行
  18. ❤️数据结构之栈(图文版详解)❤️
  19. IOS (不越狱)网络抓包
  20. 基于 python 的单细胞转录因子分析

热门文章

  1. 算法原理系列:红黑树
  2. 计算机具有理性和逻辑思维吗,我们的理性和逻辑思维能力真的有那么重要吗?...
  3. 设计分享|基于51单片机的数字时钟(汇编)
  4. 共轭对称序列和共轭反对称序列
  5. JWT、JWE、JWS 、JWK 到底是什么?该用 JWT 还是 JWS?
  6. 最近玩喂喂我的小仓鼠吧,玩上瘾了……
  7. Warshall沃舍尔算法
  8. ye321片库_jQuery的简约幻灯片库
  9. PHP导入Excel文件后缀xlsx与xls的处理问题
  10. 分解成质因数(如435234=251*17*17*3*2