关于android获取手机号码(主要是移动手机)

转载+整理(尚未找到原文链接,我参考与http://blog.csdn.net/sunny2come/article/details/8290023)

首先手机号码不是所有的都能获取,只是有很少一部分可以拿到。

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

从技术层面而言,手机的SIM卡上并不会存储手机号码信息,只会存储IMSI(International Mobile Subscriber Identification Number)。手机号码(MSISDN)都是登记在HLR(Home Location Register)中的,在HLR中会把IMSI和MSISDN关联在一起。

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

客户端获取:在客户端对移动用户而言只能够获取诸如IMSIIMEI号等,并不能直接获得手机号。而对电信CDMA机卡合一用户可以获取手机号码。
服务器端获取:在早期的移动白名单中是能够获得明文的手机号的,最近移动策略变了,手机号变成了天书般的唯一串号。因此目前从服务器端直接获取手机号也不行了。
通过短信方式:让用户上行一条短信,通过短信网关获取用户手机号,从而将用户id与手机号绑定
目前能够想到的能够相对可靠地自动获取用户手机号的方法只有通过短信方式。

 

这里再提另一个获取手机号的方式:转载于http://blog.vsharing.com/51bk/A908299.html

 

移动支持2种上网模式:cmwapcmnet
CMWAP 和 CMNET 只是移动人为划分的两个GPRS接入方式。前者是为手机WAP上网而设立的,后者则主要是为PC、笔记本电脑、PDA等利用GPRS上网服务。   cmwap 应用采用的实现方式是 终端+ WAP 网关+ WAP 服务器 的模式。主要的目的是通过 WAP 网关完成 WAP-WEB 的协议转换 以达到节省网络流量和兼容现有 WEB 应用的目的。 WAP 网关从技术的角度讲,只是一个提供代理服务的主机,它不一定由网络运营商提供。目前只有唯一的一个 WAP 网关: 10.0.0.172 (但各省市可能有各自的二级代理),标准的 WAP 网关仅仅实现了 HTTP 代理的功能,并未完成路由、 NAT 等局域网网关的功能。这就决定了它在应用上所受到的限制。目前,移动的 WAP 网关对外只提供 HTTP 代理协议( 80 8080 端口)和 WAP 网关协议( 9201 端口)。

 CMNET拥有完全的Internet访问权,与internet一样,没有带来网关。

有了这个概念之后,让我们继续:
如何通过程序获得用户手机号:

如果用户要访问目标wap网站,在浏览器中输入wap.jxc114.com网址,选择使用cmwap接入点上网,则默认会先到wap网关,由wap网关进行转接到目标wap网站。因为是经过了wap网关的过滤,在出来的信息中,网关向http header中注入了用户的手机号信息,同时分两种情况,一个是明文的手机号,一种是被加密的手机号码,为256为字符,对于明文的可以使用如下方法直接获得:request.ServerVariables("x-up-calling-line-id ")对于加密手机号:网关把他放到header“deviceid”的属性中,如果要获得手机号,则需要移动misc系统的支持,通过密文找到对应的手机号。(现在已经无法使用了

但是好景不长,到了2005年,移动为了打压免费的wap网站(移动梦网流量被免费wap站分流了n多),取消了网关返回用户手机号的功能, 同时也过滤掉了返回UserAgent的功能。就是因为移动的一己私利,导致当年如火如荼的移动互联网萌芽被扼杀了,指导今天wap网站也再没有什么新的起色。但愿随着无线高速公路(3G)的全面商用,移动能为了整个移动互联网产业的发展把,高速公路的收费站(CMNET)取消,或者资费降低。只有整个产业环境具备了,无线互联网才能真正有所发展,要不然就是一个炒作概念。。。。当然这些都是随便写的,下面继续原理分析:
我们知道做无线互联网,最重要的两个信息一个就是UA、一个就是用户手机号;知道了UA就可以知道手机的机型,我就可以提供更有针对的显示界面,比如使用N95手机进行访问,页面直接显示为240×320进行显示,是Symbian OS v9.2操作系统S60平台,我们就可以提供相应的下载软件,这些都是UI交互中最必须的(移动做的差,还不让别人做的好,是么世道!);而获得用户的手机号,就可以知道订购关系,甚至可以进行小额移动支付业务。
那么网关又是如何获得UA和用户的手机号呢?
我们知道每个SIM卡背面的号码是SIM卡的电子串号,也叫IMSI号码,这个号码是全球唯一的,是国际电联分配给每个运营商的,电话号码和IMSI没有任何关系,当开通服务时电话号码和IMSI号码在交换机上做绑定,这样你的SIM卡就可以用了。(所以丢了sim卡,但是通过不卡,手机号是可以不变的)
那么用户在使用客户端也好,浏览器也好,访问wap网址的时候,根据3GPP的链路协议,会自动上传imsi号码,网关获得imsi再到misc系统中(misc再调用移动的基础网络数据)获得用以绑定的手机号,至于是否在从网关中吐出手机号,那就是移动说的算了。
至于UA,如果使用浏览器则浏览器会默认上传;如果是用客户端的方式,则需要受到填充UA信息,当然也可以不填。
是以至此,那么怎么获得手机号呢?
1、 大的sp都会和移动签约,申请获得网关转发的手机号;
2、 与业务进行绑定,要求用户填写手机号码(这也是没有办法的办法,所以为什么很多wap站都要求用户输入手机号的原因)
3、 和已经签约sp进行合作;
 
再补充一下,如果使用cmnet上网的时候,是没有办法获得用户手机号码的,因为他没有通过网关。

 

Android开发平台中,可通过TelephonyManager 获取本机号码。

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

txtPhoneNumber.setText(phoneMgr.getLine1Number()); //txtPhoneNumber是一个EditText 用于显示手机号

:

根据Android的安全机制,在使用TelephonyManager时,必须在AndroidManifest.xml中添加<uses-permission android:name="READ_PHONE_STATE" /> 否则无法获得系统的许可。

手机型号 Build.MODEL

String

MODEL

The end-user-visible name for the end product.

sdk版本 Build.VERSION.SDK

String

SDK

This constant is deprecated. Use SDK_INT to easily get this as an integer.

frimware版本号(系统版本号) Build.VERSION.RELEASE

String

RELEASE

The user-visible version string.

 

   
   
   
   
  1. private void loadPhoneStatus(){ 
  2.  TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); 
  3.  txtPhoneModel.setText(Build.MODEL); //手机型号  
  4. txtPhoneNumber.setText(phoneMgr.getLine1Number());//本机电话号码 
  5.  txtSdkVersion.setText(Build.VERSION.SDK);//SDK版本号  
  6. txtOsVersion.setText(Build.VERSION.RELEASE);//Firmware/OS 版本号 

 

事实上,Build能向我们提供包括 硬件厂商,硬件编号,序列号等很多信息 调用方法也都同上,很简单。

String

BOARD

The name of the underlying board, like "goldfish".

String

BOOTLOADER

The system bootloader version number.

String

BRAND

The brand (e.g., carrier) the software is customized for, if any.

String

CPU_ABI

The name of the instruction set (CPU type + ABI convention) of native code.

String

CPU_ABI2

The name of the second instruction set (CPU type + ABI convention) of native code.

String

DEVICE

The name of the industrial design.

String

DISPLAY

A build ID string meant for displaying to the user

String

FINGERPRINT

A string that uniquely identifies this build.

String

HARDWARE

The name of the hardware (from the kernel command line or /proc).

String

HOST

 

String

ID

Either a changelist number, or a label like "M4-rc20".

String

MANUFACTURER

The manufacturer of the product/hardware.

String

MODEL

The end-user-visible name for the end product.

String

PRODUCT

The name of the overall product.

String

RADIO

The radio firmware version number.

String

SERIAL

A hardware serial number, if available.

String

TAGS

Comma-separated tags describing the build, like "unsigned,debug".

long

TIME

 

String

TYPE

The type of build, like "user" or "eng".

String

UNKNOWN

Value used for when a build property is unknown.

String

USER

=================================================

首先我们来明确几个概念:

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

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

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

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

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

IMSI是一个唯一的数字, 标识了GSMUMTS 网络里的唯一一个用户它存储 在手机的SIM卡里,它会通过手机发送到网络上. IMSI 与 SIM唯一对应

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

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

 

   
   
   
   
  1. 代码: 
  2. TelephonyManager tm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);      
  3.            
  4.    /*    
  5.     * 电话状态:    
  6.     * 1.tm.CALL_STATE_IDLE=0          无活动    
  7.     * 2.tm.CALL_STATE_RINGING=1  响铃    
  8.     * 3.tm.CALL_STATE_OFFHOOK=2  摘机    
  9.     */     
  10.    tm.getCallState();//int      
  11.            
  12.    /*    
  13.     * 电话方位:    
  14.     *     
  15.     */     
  16.    tm.getCellLocation();//CellLocation      
  17.            
  18.    /*    
  19.     * 唯一的设备ID:    
  20.     * GSM手机的 IMEI 和 CDMA手机的 MEID.     
  21.     * Return null if device ID is not available.    
  22.     */     
  23.    tm.getDeviceId();//String      
  24.            
  25.    /*    
  26.     * 设备的软件版本号:    
  27.     * 例如:the IMEI/SV(software version) for GSM phones.    
  28.     * Return null if the software version is not available.     
  29.     */     
  30.    tm.getDeviceSoftwareVersion();//String      
  31.            
  32.    /*    
  33.     * 手机号:    
  34.     * GSM手机的 MSISDN.    
  35.     * Return null if it is unavailable.     
  36.     */     
  37.    tm.getLine1Number();//String      
  38.            
  39.    /*    
  40.     * 附近的电话的信息:    
  41.     * 类型:List<NeighboringCellInfo>     
  42.     * 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES    
  43.     */     
  44.    tm.getNeighboringCellInfo();//List<NeighboringCellInfo>      
  45.            
  46.    /*    
  47.     * 获取ISO标准的国家码,即国际长途区号。    
  48.     * 注意:仅当用户已在网络注册后有效。    
  49.     *       在CDMA网络中结果也许不可靠。    
  50.     */     
  51.    tm.getNetworkCountryIso();//String      
  52.            
  53.    /*    
  54.     * MCC+MNC(mobile country code + mobile network code)    
  55.     * 注意:仅当用户已在网络注册时有效。    
  56.     *    在CDMA网络中结果也许不可靠。    
  57.     */     
  58.    tm.getNetworkOperator();//String      
  59.            
  60.    /*    
  61.     * 按照字母次序的current registered operator(当前已注册的用户)的名字    
  62.     * 注意:仅当用户已在网络注册时有效。    
  63.     *    在CDMA网络中结果也许不可靠。    
  64.     */     
  65.    tm.getNetworkOperatorName();//String      
  66.            
  67.    /*    
  68.     * 当前使用的网络类型:    
  69.     * 例如: NETWORK_TYPE_UNKNOWN  网络类型未知  0    
  70.       NETWORK_TYPE_GPRS     GPRS网络  1    
  71.       NETWORK_TYPE_EDGE     EDGE网络  2    
  72.       NETWORK_TYPE_UMTS     UMTS网络  3    
  73.       NETWORK_TYPE_HSDPA    HSDPA网络  8     
  74.       NETWORK_TYPE_HSUPA    HSUPA网络  9    
  75.       NETWORK_TYPE_HSPA     HSPA网络  10    
  76.       NETWORK_TYPE_CDMA     CDMA网络,IS95A 或 IS95B.  4    
  77.       NETWORK_TYPE_EVDO_0   EVDO网络, revision 0.  5    
  78.       NETWORK_TYPE_EVDO_A   EVDO网络, revision A.  6    
  79.       NETWORK_TYPE_1xRTT    1xRTT网络  7    
  80.     */     
  81.    tm.getNetworkType();//int      
  82.            
  83.    /*    
  84.     * 手机类型:    
  85.     * 例如: PHONE_TYPE_NONE  无信号    
  86.       PHONE_TYPE_GSM   GSM信号    
  87.       PHONE_TYPE_CDMA  CDMA信号    
  88.     */     
  89.    tm.getPhoneType();//int      
  90.            
  91.    /*    
  92.     * Returns the ISO country code equivalent for the SIM provider's country code.    
  93.     * 获取ISO国家码,相当于提供SIM卡的国家码。    
  94.     *     
  95.     */     
  96.    tm.getSimCountryIso();//String      
  97.            
  98.    /*    
  99.     * Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM. 5 or 6 decimal digits.    
  100.     * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.    
  101.     * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).    
  102.     */     
  103.    tm.getSimOperator();//String      
  104.            
  105.    /*    
  106.     * 服务商名称:    
  107.     * 例如:中国移动、联通    
  108.     * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).    
  109.     */     
  110.    tm.getSimOperatorName();//String      
  111.            
  112.    /*    
  113.     * SIM卡的序列号:    
  114.     * 需要权限:READ_PHONE_STATE    
  115.     */     
  116.    tm.getSimSerialNumber();//String      
  117.            
  118.    /*    
  119.     * SIM的状态信息:    
  120.     *  SIM_STATE_UNKNOWN          未知状态 0    
  121.     SIM_STATE_ABSENT           没插卡 1    
  122.     SIM_STATE_PIN_REQUIRED     锁定状态,需要用户的PIN码解锁 2    
  123.     SIM_STATE_PUK_REQUIRED     锁定状态,需要用户的PUK码解锁 3    
  124.     SIM_STATE_NETWORK_LOCKED   锁定状态,需要网络的PIN码解锁 4    
  125.     SIM_STATE_READY            就绪状态 5    
  126.     */     
  127.    tm.getSimState();//int      
  128.            
  129.    /*    
  130.     * 唯一的用户ID:    
  131.     * 例如:IMSI(国际移动用户识别码) for a GSM phone.    
  132.     * 需要权限:READ_PHONE_STATE    
  133.     */     
  134.    tm.getSubscriberId();//String      
  135.            
  136.    /*    
  137.     * 取得和语音邮件相关的标签,即为识别符    
  138.     * 需要权限:READ_PHONE_STATE    
  139.     */     
  140.    tm.getVoiceMailAlphaTag();//String      
  141.            
  142.    /*    
  143.     * 获取语音邮件号码:    
  144.     * 需要权限:READ_PHONE_STATE    
  145.     */     
  146.    tm.getVoiceMailNumber();//String      
  147.            
  148.    /*    
  149.     * ICC卡是否存在    
  150.     */     
  151.    tm.hasIccCard();//boolean      
  152.            
  153.    /*    
  154.     * 是否漫游:    
  155.     * (在GSM用途下)    
  156.     */     
  157.    tm.isNetworkRoaming();// 
  158.  
  159.   

 

你可能感兴趣的:(android,手机号,获取手机号)