`
suliuyes
  • 浏览: 93693 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

关于android读取用户号码,手机串号,SIM卡序列号

阅读更多

关于android读取用户号码,手机串号,SIM卡序列号


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,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读取用户号码,手机串号,SIM卡序列号的实现代码

    在Android平台上,获取用户的电话号码、手机串号(IMEI)、SIM卡序列号(ICCID)以及 IMSI(国际移动用户识别码)等信息对于某些应用程序来说是必要的,例如通讯录应用或者设备管理应用。下面将详细介绍如何在...

    Android 读取SIM卡信息代码(完整工程)

    在Android平台上,开发人员可以利用特定的API来访问和读取SIM卡信息,这在一些应用中非常有用,比如定位、身份验证或者提供网络服务。本文将深入探讨如何通过编程方式实现这一功能,并且详细解释如何创建一个完整的...

    Android 读取IMSI 和IMEI号支持双卡双待

    本文将深入探讨如何在Android平台上读取这两个标识符,特别是在支持双卡双待的设备上获取它们,并判断当前设备通过哪个卡进行网络连接。 IMSI是全球唯一的移动用户识别码,它由MCC(Mobile Country Code,移动国家...

    Android获取手机通讯录、sim卡联系人及调用拨号界面方法

    在Android平台上,获取手机通讯录和SIM卡联系人,以及调用拨号界面是常见的功能需求,这通常涉及到用户信息的读取和系统的交互。以下将详细解释如何实现这些功能。 首先,要获取手机通讯录的联系人信息,我们需要...

    Android 读取SIM卡参数

    ### Android 读取SIM卡参数 #### 概述 在Android开发中,有时我们需要获取SIM卡的相关信息,例如IMSI(国际移动用户识别码)、IMEI(国际移动设备身份码)等,这些信息对于实现某些功能(如网络状态检测、设备唯一...

    硬盘序列号读取-物理串号修改破解工具集

    硬盘序列号读取+硬盘物理串号修改等破解工具集,破解软件+硬盘截取+虚拟的好工具。

    SD卡序列号修改工具(1).zip

    4. 读取与修改:在工具界面,你可以查看当前SD卡的序列号。若要修改,输入新的序列号,注意序列号应符合特定格式,通常由一组字母和数字组成。 5. 应用更改:点击“修改”或“应用”按钮,工具会执行序列号更改操作...

    C# 获取IMEI即获取移动设备手机串号手机编码号源代码

    IMEI(International Mobile Equipment Identity,国际移动设备身份码)是全球唯一的移动设备识别码,用于标识每一部手机或移动设备。在C#编程环境中,如果你需要在Windows Phone、Android或iOS等平台上获取IMEI,你...

    读写SD卡序列号

    首先,我们需要知道的是,读取SD卡序列号通常涉及到Android系统的权限管理。在Android 6.0及以上版本,应用需要请求`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限才能访问SD卡。如果要修改序列号,可能还...

    vc开发读取手机sim卡联系人源代码

    vc开发读取手机sim卡联系人源代码,方便大家下载,不要资源分。

    VB6读取硬盘物理序列号/逻辑序列号/CPU序列号/主板序列号

    在VB6(Visual Basic 6)编程环境中,开发者可以利用特定的API函数和Windows系统接口来获取计算机硬件的序列号,如硬盘物理序列号、逻辑序列号、CPU序列号以及主板序列号。这些序列号是硬件设备的独特标识,用于区分...

    Android获取手机SIM卡运营商信息的方法.7z

    在Android系统中,获取手机SIM卡的运营商信息是开发者经常需要进行的一项操作,这有助于实现例如定位用户位置、提供定制化服务等功能。本篇将详细阐述如何在Android应用中获取SIM卡运营商信息,并通过阅读提供的...

    android写sim卡短信

    在Android系统中,SIM卡(Subscriber Identity Module)是手机用户身份的重要载体,它存储着用户的个人信息、联系人以及短信等数据。"android写sim卡短信"这个话题涉及到的是如何通过编程方式来操作SIM卡中的联系人...

    用Java解析手机号获取手机信息(归属地、Sim卡类型、移动或是联通、区号、邮编)

    7. **Sim卡类型的获取**:获取SIM卡类型通常需要硬件级别的支持,例如通过Android的`TelephonyManager`类可以获取到SIM卡的IMSI(国际移动用户识别码),然后通过解析IMSI前几位判断SIM卡类型。但这通常只适用于移动...

    android NFC (读取M1卡内容)

    1. **开启NFC功能**:在Android应用中,用户需要先确保手机的NFC功能已经开启。你可以通过调用`NfcAdapter.getDefaultAdapter(this)`获取到NFC适配器,并检查其状态,如果未开启则提示用户开启。 2. **注册监听器**...

    Android 手机获取手机号实现方法

    在Android平台上,获取手机用户绑定的手机号码是一个常见的需求,特别是在开发需要用户验证或个性化服务的应用时。然而,由于隐私保护政策和不同运营商的限制,直接获取手机号码并不总是可行的。本文将详细介绍如何...

    Android例子源码GPS、GPRS、WIFI状态判断+SIM卡信息读取

    最后,关于SIM卡信息的读取,Android提供了TelephonyManager类来获取SIM卡的相关信息。例如,获取SIM卡运营商名称: ```java TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context....

    sim卡查询软件

    2. **SIM卡信息查询**:通过该软件,用户可以查看SIM卡的序列号(ICCID)、SIM卡运营商、SIM卡类型(如SIM、USIM或eSIM)以及SIM卡的余额和有效期等。这对于诊断通信问题、转移服务或了解SIM卡状态非常有用。 3. **...

    siminfo3.55 sim卡信息检测工具

    这是一款专业的SIM卡信息读取和分析软件,它能够帮助用户获取SIM卡上的各种关键信息,包括但不限于ICCID(国际移动用户识别码)、IMSI(国际移动用户识别码)、SIM卡序列号等。这些信息在故障诊断、设备注册、网络...

    STM8S系列单片机读取IC卡序列号

    在这个项目中,我们关注的是如何利用STM8S单片机读取IC卡的序列号,这个过程通常涉及到无线射频识别(RFID)技术。在这里,IC卡通常指的是带有RFID芯片的卡片,而RC522是一种常用的RFID模块,能够与这些卡片进行通信...

Global site tag (gtag.js) - Google Analytics