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

2023-11-01

转载+整理(尚未找到原文链接,我参考与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和手机号码。 

客户端获取:在客户端对移动用户而言只能够获取诸如IMSI、IMEI号等,并不能直接获得手机号。而对电信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系统的支持,通过密文找到对应的手机号。(现在已经无法使用了

我们知道做无线互联网,最重要的两个信息一个就是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是一个唯一的数字, 标识了GSM和UMTS 网络里的唯一一个用户. 它存储 在手机的SIM卡里,它会通过手机发送到网络上. IMSI 与 SIM唯一对应

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操作的函数获得。

 

 
   
  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.   

 

转载于:https://blog.51cto.com/sunjilife/1163677

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • i219-v不支持服务器,网络适配器中找不到Intel(R) Ethernet Connection I219-V该怎么解决?在虚拟机配...

    是因为网络适配器权限问题 1 打开网络连接 如下图 2 打开本地连接的属性 选择高级菜单 并将Internet连接共享的勾都打上 3 然后选择无线网卡进行专用网络连接 4 设置之后 您可以看到本地连接有一个手形图标 表明它是一个共版享状态
  • 三极管饱和及深度饱和状态的理解和判断!

    三极管饱和问题总结 1 在实际工作中 常用Ib V R作为判断临界饱和的条件 根据Ib V R算出的Ib值 只是使晶体管进入了初始饱和状态 实际上应该取该值的数倍以上 才能达到真正的饱和 倍数越大 饱和程度就越深 2 集电极电阻 越大越容易
  • 单选按钮input[type=radio],加上disabled后按钮颜色失效,始终默认为灰色

    在前端使用单选按钮input type radio 时 渲染后台数据时将单选按钮设为不可修改 给input加上disabled后 按钮颜色变灰 且通过css修改样式也无法改变 通过百度尝试了类似以下方式的几种修改css样式的常用办法解决 但
  • 【Android学习】导入别人的Android项目到AS中

    更新 最好直接导入 有错误再根据对应错误修改 学习阶段 下载学习他人的项目是必不可少的一步 但是新手又常常会遇到各种奇葩的问题 问题不可怕 可怕是自己退缩 总结下自己的一些经验 望对后来的你有所帮助 一 快速更改 在移植别人项目之前 最好先
  • 华为机试题69-矩阵乘法

    描述 如果A是个x行y列的矩阵 B是个y行z列的矩阵 把A和B相乘 其结果将是另一个x行z列的矩阵C 矩阵的大小不超过100 100 输入描述 第一行包含一个正整数x 代表第一个矩阵的行数 第二行包含一个正整数y 代表第一个矩阵的列数和第二
  • 20210220--CTF小笔记之常见的md5碰撞

    欢迎大家一起来Hacking水友攻防实验室学习 渗透测试 代码审计 免杀逆向 实战分享 靶场靶机 求关注 0e开头的md5和原值 QNKCDZO 0e830400451993494058024219903391 s878926199a 0e
  • 小程序内嵌webview实现支付

    点击上方 青年码农 关注 回复 特效源码 可获取各种资料 目前的一个小程序项目需要把客户之前的h5页面嵌入到现在的小程序中 并且之前的支付功能要正常 小程序提供了webview开放能力供我们使用 但是不允许在webview直接调起微信支付
  • 重载的分析

    前言 在c 中 出现重载的概念 其实就是一个高级语言的象征 他的出现就是机器语言更加的自然化 他其实可以理解位我们自然语言中的动词 它可以和不同的名词起到不同的功能 重载 定义 用一个相同的函数名来定义不同的函数 重载的条件 参数的个数不同
  • CMSIS-RTOS的信号量使用备忘

    说明 因为要使用CMSIS RTOS的信号量 所以需要了解以下几点功能 1 接收信号量时 返回值的意思 2 接收信号量时 如果信号量容器不只为一 那么是否可以再次接收到 3 发送信号量是否有限制 带着以上问题做了一个测试程序 例一 程序代码
  • strace ltrace记录

    strace 安装 常用选项 报错 strace trace system calls and signals ltrace A library call tracer 安装 首次使用可能出现这个提示 就是没安装 yum y install
  • ubuntu 远程服务器文件与本地文件互传

    放在这里自学 cite https blog csdn net Iv zzy article details 109412198 1 从服务器下载文件到本地 scp r 远程服务器用户名 远程IP 需要下载的文件路径 本地存放文件路径 2
  • 金融分析与风险管理——资本资产定价模型

    金融分析与风险管理 资本资产定价模型 1 系统性风险与非系统性风险 2 资本资产定价模型 1 系统性风险与非系统性风险 在理论上 股票面临的风险可以抽象的划分为系统性风险与非系统性风险 系统性风险 不可分散风险 也称市场风险 通常是由于公司
  • 数据挖掘十大算法(一):决策树算法 python和sklearn实现

    学完到第三章 决策树 python代码实现的仅是ID3算法 sklearn为优化过的C4 5 这里做一个详细的总结包括 原理 代码 可视化 scikit learn实现 皆为亲自实践后的感悟 以下进入正文 早前简单了解了决策树的原理 然后为
  • clang与gcc的区别

    gcc g 和 clang clang 都是Linux操作系统中常用的C C 编译器 gcc g 是gnu标准下的Linux的编译器 clang是一个C 编写 基于LLVM Low Level Virtual Machine 底层虚拟机 是
  • QT 设置程序图标

    在qt应用程序中 我们能想到的图标一般就以下三种 icon种类 应用窗口左上角的 图标 setWindowIcon 状态栏上显示的图标 setWindowIcon 可执行程序本身的图标 两种设置方式 下面会讲 对于以上三种图标都该怎么样设置
  • 【PTA】判断一个数是否为回文数

    1 题目 如果一个数与它的反转数相等 则该数为回文数 输入一个数 判断是否为回文数 输入格式 输入一个数 输出格式 若XX是回文数 则输出 XX 是回文数 若不是 则输出 XX 不是回文数 输入样例1 6234326 输出样例1 62343
  • radius认证服务器系统,03-Radius认证配置举例

    RADIUS 是一种用于在需要认证其链接的网络访问服务器 NAS 和共享认证服务器之间进行认证 授权和记帐信息的文档协议 RADIUS在运维审计系统中 主要体现的是认证功能 收集RADIUS服务器信息 IP地址 RADIUS端口号 RADI
  • 快速理解python中的可迭代对象、迭代器、生成器

    快速学会python中的可迭代对象 迭代器 生成器 今天周一 又要开始新的一周的学习了 加油鸭 多学一点不吃亏哈哈 迭代 什么是迭代 迭代就是将重复的代码进行执行 处理相似的数据集 并且上一个迭代的结果会给到下一次 作为初始化值进行下一次的
  • 利用Jmeter对禅道进行性能测试

    前言 jmeter工具的学习和使用 一 背景 前段时间没事 自己在虚拟机上搭建了一个禅道环境 并在外机上安装jmeter 编写脚本对禅道进行简单的性能测试 二 操作步骤 1 环境搭建 1 1 禅道环境搭建 本地电脑安装VMware Work
  • win11系统23年6月最新anaconda安装教程及配置环境变量

    win11系统23年6月最新anaconda安装教程及配置环境变量 官网下载anaconda 安装anaconda 注意 接下来这一步如果选择Just Me 后续则可选择自动 手动配置环境变量 如果选择ALL Users 则只能手动配置环境

随机推荐