Android 获取本机号码(收集)

news/2024/11/25 17:21:57/

SIM卡存储的数据可分为四类

第一类是固定存放的数据。这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI)、鉴权密钥(KI)、鉴权和加密算法等等。

第二类是暂时存放的有关网络的数据。如位置区域识别码(LAI)、移动用户暂时识别码(TMSI)、禁止接入的公共电话网代码等。

第三类是相关的业务代码,如个人识别码(PIN)、解锁码(PUK)、计费费率等。

第四类是电话号码簿,是手机用户随时输入的电话号码。用户全部资料几乎都存储在SIM卡内,因此SIM卡又称为用户资料识别卡。

 

IMSI是一个唯一的数字, 标识了GSMUMTS 网络里的唯一一个用户它存储在手机的SIM卡里,它会通过手机发送到网络上. IMSI  SIM唯一对应。从技术层面而言,手机的SIM卡上并不会存储手机号码信息,只会存储IMSI(International Mobile Subscriber Identification Number)。手机号码(MSISDN)都是登记在HLR(Home Location Register)中的,在HLR中会把IMSI和MSISDN关联在一起。

IMEI也是一串唯一的数字, 标识了GSM  UMTS网络里的唯一一个手机.它通常被打印在手机里电池下面的那一面,拨 *#06# 也能看到它. IMEI  设备唯一对应.

1)IMEI不存在于SIM卡中,它是手机本身的串号。 
2)
通常我们所说的手机号也不存在于SIM卡中,虽然SIM卡中有一个专门存储SIM卡本身号码的地方,但是此号码是通过手工设定的,而且是可以更改的。   SIM卡的识别通常使用IMSI号,这个对于SIM卡是唯一的。
 
3)
使用SimGetRecordInfo之类的函数获得SIM卡的IMSI号码能否成功依赖于设备制造商是否实现了此函数,据我所知在DOPOD的机器上是可以获得,但是在联想的机器上却不行,其他机器没有。
 
4)
获得IMEI以及IMSI可以通过RIL或者TAPI中的LINE操作的函数获得。


 

下面给出获取手机本机号码的代码:

        TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

        String deviceid = tm.getDeviceId();

        String tel = tm.getLine1Number();//手机号码

        String imei = tm.getSimSerialNumber();

        String imsi = tm.getSubscriberId(); 

添加权限:

 

 

注意,手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手机号码的数据写入到sim卡中。这个就像是一个变量,当移动运营商为它赋值了,它自然就会有值。不赋值自然为空。这就是为什么很多人得不到本机号码的原因。



    手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。试想,你的SIM卡丢失后,补办一张新的会换号码吗?是不会的.就是因为在你的手机号码对应的IMSI号 在移动运营商中被修改成新SIM卡的IMSI号码。 
    那么手机号为什么有的就能显示呢? 
    这个就像是一个变量,当移动运营商为它赋值了,它自然就会有值。不赋值自然为空。 
对于移动的用户,手机号码(MDN)保存在运营商的服务器中,而不是保存在SIM卡里。SIM卡只保留了IMSI和一些验证信息。手机每次入网注册的时候,都会以短信的形式将IMSI及验证信息上传到运营商的服务器,服务器在完成注册动作之后,会以短信的形式将注册的结果下发到手机里。下发的内容会因条件不同而不同。 
    如果服务器在下发的短信中,不包含手机的号码,手机是无法取得电话号码。如果短信中包含了号码,手机才会将其缓存,以备他用.此外,对于其他运行商的SIM卡或者UIM卡,MDN有可能保存在UIM卡中。100%能够取得本机号码不太可能。 
    移动神州行,联通的卡是可以取到的.动感地带的取不到.别的卡还没有试过. 
    能够读取SIM卡号的话应该有前提.那就是SIM卡已经写入了本机号码,不然是无法读取的。



网络上有朋友提出了下面的解决方案:

给10086发个短信就行了,然后获取发件箱中的发件人号码...反正给10086发短信或者打电话是免费的 ,但是你得注意了 
1、获取发件箱中的发件人号码后你得把发件箱中记录删除; 
2、就是你还要拦截10086给你回复的短信,不然会有个notification显示在屏幕上方,提示10086发来个短信,让你查看; 
这些都是为了取得本机号码的任务下,但同时又提高了用户的体验度...明白吗? 

但是,有很多人说在收到的短信中没有收件人号码,所以可能还是取不到手机号码(还未测试过)



 

    中国移动的SIM卡里只有IMSI号码而没有存储手机号码,在中国移动的HLR中会有一张映射表,专门用于把用户手机SIM卡的IMSI号映射成为用户的手机号码,这就是移动丢卡不丢号的业务也就是缘于此,也是一卡多号的原理。而电信CDMA(原来联通CDMA)的机卡合一的手机卡里会同时存在IMSI和手机号码。

   
客户端获取:在客户端对移动用户而言只能够获取诸如IMSIIMEI号等,并不能直接获得手机号。而对电信CDMA机卡合一用户可以获取手机号码。
服务器端获取:在早期的移动白名单中是能够获得明文的手机号的,最近移动策略变了,手机号变成了天书般的唯一串号。因此目前从服务器端直接获取手机号也不行了。

    目前能够想到的能够相对可靠地自动获取用户手机号的方法只有通过短信方式。

通过短信方式:让用户上行一条短信,通过短信网关获取用户手机号,从而将用户id与手机号绑定


另外: http://macleo.iteye.com/blog/1608311  这个地址集结了很多关于获取本机号码的理论和方法。

http://www.ppmy.cn/news/665000.html

相关文章

iOS获取本机号码

参考: 1、IOS开发之----获取本机号码等

怎样用AT指令查询本机手机号码

ATCNUM是向SIM卡查询本机号码的。 但是你必须先把这个号码写到SIM卡里面。 因为无论移动或者联通的SIM卡,买给 用户 的时候都没有把本机号码写到SIM卡内。 一旦你把本机号码写到了SIM卡内,无论你把这张SIM卡插到那台手机,用ATCNUM都可以…

如何获取手机的本机号码

读本机号码可以调用这个函数:mmi_phb_owner_number_get_entry_req,这个函数里是给L4C发个消息然后去读SIM的MSISDN; 通过mmi_phb_owner_number_get_entry_rsp()可以去获取到本机号码。 但是有一个要注意的是&#x…

获取本机号码及sim卡信息

一、SIM卡存储的数据可分为四类,它们分别是: 第一类是固定存放的数据。这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI)、鉴权密钥(KI)、鉴权和加密算法等等。 第…

使用AT命令获取本机号码

我之前认为手机号码与SIM卡是一一对应的,后来想想不对,因为有换卡不换号的情况啊,所以SIM卡应该只是一个电话号码的储存介质,而与SIM卡一一对应的是另一个编码——IMSI(国际移动签署这标识)。以下为获取IMS…

JavaScript:数组字段大写转为小写

我们可以使用forEach()方法,遍历数组中的每个对象,然后将所有字段都转换为小写。 首先使用forEach()方法遍历数组中的每个对象。然后,使用Object.keys()方法获取对象中的所有字段名,并将它们全部转换为小写。最后,重新…

VS2022编译运行VS2015的项目

最近新装了VisualStudio2022,有一些VS2015老的项目需要运行,但不想再安装VS2015,就想能否直接在VS2022编译运行,研究一下发现可行,记录一下。 1. 直接升级VS2015项目到2022使用windows sdk 10.0 发现老代码里的一些语…

IOS之条形码

在我们开发ios应用时,尤其是电子商务类应用,时常遇到条形码扫描的业务需求,幸运的已经有开源的SDK供我们使用──条形码的SDK for ios,下面介绍一下这个开源的SDK的使用方法: 免费的条形码是zbar,下载地址是:http://zb…