一、文章一

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

具体处理代码:(程序在模拟器上无法实现,必须连接手机)

  //创建电话管理

  TelephonyManager tm = (TelephonyManager)

  //与手机建立连接
  activity.getSystemService(Context.TELEPHONY_SERVICE);

  //获取手机号码

  String phoneId = tm.getLine1Number();

  //记得在manifest file中添加
    <uses-permission
    android:name="android.permission.READ_PHONE_STATE" />

二、文章二

两个方案:1 通过android.permission.READ_PHONE_STATE读取  2 通过短信过滤,读取手机号。

按照第1个方案,AndroidManifest.xml需要添加 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

并创建一个类PhoneInfo

package com.hbj.test;import android.content.Context;
import android.telephony.TelephonyManager;  /** * 读取手机设备信息测试代码 */
public class PhoneInfo {  private TelephonyManager telephonyManager;  /** * 国际移动用户识别码 */  private String IMSI;  private Context cxt;  public PhoneInfo(Context context) {  cxt=context;  telephonyManager = (TelephonyManager) context  .getSystemService(Context.TELEPHONY_SERVICE);  }  /** * 获取电话号码 */  public String getNativePhoneNumber() {  String NativePhoneNumber=null;  NativePhoneNumber=telephonyManager.getLine1Number();  return NativePhoneNumber;  }  /** * 获取手机服务商信息 */  public String getProvidersName() {  String ProvidersName = "N/A";  try{  IMSI = telephonyManager.getSubscriberId();  // IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。
        System.out.println(IMSI);  if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {  ProvidersName = "中国移动";  } else if (IMSI.startsWith("46001")) {  ProvidersName = "中国联通";  } else if (IMSI.startsWith("46003")) {  ProvidersName = "中国电信";  }  }catch(Exception e){  e.printStackTrace();  }  return ProvidersName;  }  public String  getPhoneInfo(){  TelephonyManager tm = (TelephonyManager)cxt.getSystemService(Context.TELEPHONY_SERVICE);  StringBuilder sb = new StringBuilder();  sb.append("\nDeviceId(IMEI) = " + tm.getDeviceId());  sb.append("\nDeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion());  sb.append("\nLine1Number = " + tm.getLine1Number());  sb.append("\nNetworkCountryIso = " + tm.getNetworkCountryIso());  sb.append("\nNetworkOperator = " + tm.getNetworkOperator());  sb.append("\nNetworkOperatorName = " + tm.getNetworkOperatorName());  sb.append("\nNetworkType = " + tm.getNetworkType());  sb.append("\nPhoneType = " + tm.getPhoneType());  sb.append("\nSimCountryIso = " + tm.getSimCountryIso());  sb.append("\nSimOperator = " + tm.getSimOperator());  sb.append("\nSimOperatorName = " + tm.getSimOperatorName());  sb.append("\nSimSerialNumber = " + tm.getSimSerialNumber());  sb.append("\nSimState = " + tm.getSimState());  sb.append("\nSubscriberId(IMSI) = " + tm.getSubscriberId());  sb.append("\nVoiceMailNumber = " + tm.getVoiceMailNumber());  return  sb.toString();  }
}  

MytestActivity里面这么使用:
        PhoneInfo siminfo = new PhoneInfo(MytestActivity.this);System.out.println("getProvidersName:" + siminfo.getProvidersName());System.out.println("getNativePhoneNumber:"+ siminfo.getNativePhoneNumber());System.out.println("------------------------");System.out.println("getPhoneInfo:" + siminfo.getPhoneInfo());tv.setText("getProvidersName:" + siminfo.getProvidersName()+ "getNativePhoneNumber:" + siminfo.getNativePhoneNumber()+ "getPhoneInfo:" + siminfo.getPhoneInfo());

看LOGCAT日志,结果如下:

------------------------------------------------------------

04-01 16:20:57.105: I/System.out(952): 460003121934674
04-01 16:20:57.105: I/System.out(952): getProvidersName:中国移动
04-01 16:20:57.115: I/System.out(952): getNativePhoneNumber:136XXXXXXX
04-01 16:20:57.115: I/System.out(952): ------------------------
04-01 16:20:57.145: I/System.out(952): getPhoneInfo:
04-01 16:20:57.145: I/System.out(952): DeviceId(IMEI) = 352XXXXXXXX61328
04-01 16:20:57.145: I/System.out(952): DeviceSoftwareVersion = 01
04-01 16:20:57.145: I/System.out(952): Line1Number = 136XXXXXXX
04-01 16:20:57.145: I/System.out(952): NetworkCountryIso = cn
04-01 16:20:57.145: I/System.out(952): NetworkOperator = 46000
04-01 16:20:57.145: I/System.out(952): NetworkOperatorName = 中国移动
04-01 16:20:57.145: I/System.out(952): NetworkType = 2
04-01 16:20:57.145: I/System.out(952): PhoneType = 1
04-01 16:20:57.145: I/System.out(952): SimCountryIso = cn
04-01 16:20:57.145: I/System.out(952): SimOperator = 46000
04-01 16:20:57.145: I/System.out(952): SimOperatorName = CMCC
04-01 16:20:57.145: I/System.out(952): SimSerialNumber = 898xxxxxx90108
04-01 16:20:57.145: I/System.out(952): SimState = 5
04-01 16:20:57.145: I/System.out(952): SubscriberId(IMSI) = 46000xxxxxxxx4674

那么我们来解释一下上面的信息具体代表啥意思。

getNativePhoneNumber 获取的手机号

DeviceId(IMEI)手机  国际移动用户识别码

NetworkOperator  移动运营商编号

NetworkOperatorName  移动运营商名称

SimSerialNumber  SimOperator  SimCountryIso  SimSerialNumber  SubscriberId(IMSI)   关于手机SIM卡的一些详细信息

其实代码中没有写 获取System.ANDROID_ID这个操作,因为很多手机设备获取不到andnroid_id

当然了,我们今天主要讲述<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 光使用这个权限我们可以获得的手机设备信息和手机号

如果想获得WIFI,蓝牙,GPS,读写SDCARD更多的信息,就需要添加其它的权限。

此外,本次测试我拿自己的手机SIM卡测试是可以获取到手机号码的,当然了有些手机号码是获取不到的,这里也给大家罗列了原因,

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

这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设备识别那就是IMSI号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。试想,你的SIM丢失后,补办一张新的会换号码吗?是不会的.就是因为在你的手机号码对应的IMSI号 在移动运营商中被修改成新SIM卡的IMSI号码。

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

那么我们怎么解决这个问题呢?这就是第2方案:通过10001反馈信息截取手机号码

不好实现?一个原因搞定你:项目需要!!

查了下手机的基本信息那一栏里,也没有找到手机号,看来手机中似乎没有存储这手机号。那么我就只有使用变通的手法来获取手机号了。

就是给10001发送一个短信,找了一下,发个501查询套餐情况就可以。10001会给你个反馈信息,其中包含手机号码

那么我们发送短信,然后监听得到此短信,然后分解字符串那么就可以得到手机号了。

如果是联通或者移动应该也是有类似的情况。何况给他们发短信应该不会收费。。。O(∩_∩)O~

程序如何实现?参看博客:http://www.cnblogs.com/android100/p/android-get-num.html

Android手机号码获取问题相关推荐

  1. Android手机号码获取问题 用APN来获取手机号

    原文  :  http://www.cnblogs.com/growing/archive/2010/11/19/1881372.html 手机号码不是所有的都能获取.只是有一部分可以拿到.这个是由于 ...

  2. Android系统信息获取 之十:移动网络相关信息获取

    Android平台移动网络信息主要是通过TelephonyManager类来获取的,通过前面对TelephonyManager的观察Android系统信息获取 之九:TelephonyManager类 ...

  3. Android实现获取验证码的倒计时功能

    开发中经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的. 实现如下: CountDownTimerUtils.java package com.zhw.my ...

  4. Android中获取手机中的联系人信息

    #Android中获取手机中的联系人信息 1.0.查看系统通讯录的表,表路径:data->data->com.android.providers.contacts->database ...

  5. Android实例]------获取sd卡图片显示出来

    [Android实例] 获取sd卡图片显示出来 ON 六 02 2012 IN ANDROID代码仓库, ANDROID项目代码 BY ANDROID智能手机 | 评论 package com.fil ...

  6. android如何获取listview中的任意行数据

    android如何获取listview中的任意行数据 @Override public void onItemClick(AdapterView<?> arg0, View arg1, i ...

  7. android camera2获取摄像头支持的分辨率

    android camera2 获取摄像头支持的分辨率 41的for循环我注释了,代码是获取最匹配的分辨率. private Size getMatchingSize2(){Size selectSi ...

  8. android url webview,android - webview获取到当前页面的url

    android - webview获取到当前页面的url 2017-10-23 08:54 访问量: 2958 分类: 技术 使用 webview.getUrl() 即可. 可以完美返回  a.com ...

  9. Android杂谈---获取手机屏幕大小

    Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...

最新文章

  1. 在线下线html页面,下线
  2. 京东2019春招Java工程师编程题题解
  3. 数据库服务器的文件结构6,以下数据库服务器的文件结构
  4. 程序员面试金典 - 面试题 16.04. 井字游戏(计数)
  5. 又一所新大学来了!投资百亿,对标国际一流大学
  6. php 设置cors,php – 启用cors在.htaccess
  7. 【重点】剑指offer——面试题27:二叉搜索树与双向链表
  8. php 12小时,使用php怎么将12小时制转换为24小时制
  9. python中的reindex_Python reindex使用详解
  10. 2017 年最受欢迎的 10个编程挑战网站
  11. php网站 视频马赛克,给视频打马赛克的软件 如何在视频上打马赛克 怎样给视频的局部打马赛克...
  12. hse是什么意思的缩写_什么是HSE
  13. 网络性能监测-系统监视器
  14. 华为USG防火墙及NGFW高可用性的规划与实施详解
  15. 连续十日票房日冠,《人生大事》带热了电影大盘!它凭何突出重围?
  16. java转大写_java实现数字转大写的方法
  17. 《俄罗斯方块》项目简介
  18. Cordova工程index.html/index.css/index.js结构及关键代码
  19. 2021.11.02--Estimating motorway traffic states with data fusion and physics-informed deep learning
  20. pdfview4net Crack,印PDF文件的.NET工具

热门文章

  1. 前端基础 Web网页标准
  2. pdb文件及引发的思考
  3. 分布式锁 - Redisson的看门狗(watchdog)机制
  4. USASCII7字符集导入ZHS16GBK字符集
  5. 基于Python的Web应用开发实战——3 模板
  6. sqli-labs靶场challenges第54-75关(超详细)
  7. 使用pyecharts绘制中国历代都城的分布图
  8. 简单的部门递归兰巴达写法
  9. 男人写手账哪来那么的麻烦?
  10. 菜鸟收藏:什么是.rar文件?如何打开rar文件?_下载加速吧