原文  :  http://www.cnblogs.com/growing/archive/2010/11/19/1881372.html

手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手机号码的数据写入到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" />

************************************************************************************************************************************************************

http://www.eoeandroid.com/thread-91296-1-1.html

/**
* 电信APN列表
* @author wudongdong
*
*/
public class APNNET {
public static String CTWAP="ctwap";
public static String CTNET="ctnet";
}
/**
* 电信APN列表
* @author wudongdong
*
*/
public class APNNET {
public static String CTWAP="ctwap";
public static String CTNET="ctnet";
}
//获得APN的类型
/**
* 获得APN类型
* @author wudongdong
*
*/public class ApnUtil {
private static Uri PREFERRED_APN_URI = Uri
.parse("content://telephony/carriers/preferapn");/**
* get apntype
* @param context
* @return
*/public static String getApnType(Context context){
String apntype="nomatch";
Cursor c = context.getContentResolver().query(PREFERRED_APN_URI,null, null, null, null);
c.moveToFirst();
String user=c.getString(c.getColumnIndex("user"));
if(user.startsWith(APNNET.CTNET)){
apntype=APNNET.CTNET;
}else if(user.startsWith(APNNET.CTWAP)){
apntype=APNNET.CTWAP;
}
return apntype;
}
}/**
* 获得APN类型
* @author wudongdong
*
*/
public class ApnUtil {
private static Uri PREFERRED_APN_URI = Uri
.parse("content://telephony/carriers/preferapn");/**
* get apntype
* @param context
* @return
*/public static String getApnType(Context context){
String apntype="nomatch";
Cursor c = context.getContentResolver().query(PREFERRED_APN_URI,null, null, null, null);
c.moveToFirst();
String user=c.getString(c.getColumnIndex("user"));
if(user.startsWith(APNNET.CTNET)){
apntype=APNNET.CTNET;
}else if(user.startsWith(APNNET.CTWAP)){
apntype=APNNET.CTWAP;
}
return apntype;
}
}

获得手机号码的话可以传IMSI码到指定接口,接口地址不方便说。但可以透露一点,必须走CTWAP,这也是判断APN类型的原因,发现很多应用如果APN是走代理的话就不能联网,那么再介绍一下用APN设置网络的代理信息。

Cursor c = context.getContentResolver().query(PREFERRED_APN_URI,null, null, null, null);
c.moveToFirst();
String proxy=c.getString(c.getColumnIndex("proxy"));if (!"".equals(proxy) && proxy!=null) {
Properties prop = System.getProperties();
System.getProperties().put("proxySet", "true");
prop.setProperty("http.proxyHost", c.getString(c.getColumnIndex("proxy")));
prop.setProperty("http.proxyPort", c.getString(c.getColumnIndex("port")));
String authentication = c.getString(c.getColumnIndex("user"))
+ ":" + c.getString(c.getColumnIndex("password"));
String encodedLogin = Base64.encode(authentication);
uc.setRequestProperty("Proxy-Authorization", " BASIC "
+ encodedLogin);
}c.close();

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

  1. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )

    文章目录 前言 一.获取 Activity 中的所有方法 二.获取方法上的注解 三.获取注解上的注解 四.通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...

  2. 【Android 安全】DEX 加密 ( Application 替换 | 获取 ContextImpl、ActivityThread、LoadedApk 类型对象 )

    文章目录 一.获取对象类型分析 二.替换 Application 时机 一.获取对象类型分析 在 [Android 安全]DEX 加密 ( Application 替换 | 获取 ContextImp ...

  3. 【Android 安全】DEX 加密 ( Application 替换 | 获取 ContextImpl、ActivityThread、LoadedApk 类型对象 | 源码分析 )

    文章目录 一.获取对象类型分析 二.获取 ContextImpl 类型对象 三.获取 ActivityThread.LoadedApk 类型对象 dex 解密时 , 需要将 代理 Applicatio ...

  4. android通话记录列表apk,android打电话,发短信,获取通讯录、通话记录、短信记录...

    [实例简介] 代码实现android打电话,发短信,获取通讯录.通话记录.短信记录 [实例截图] [核心代码] 19287b5f-b70c-4210-ab04-9d24ddd60788 └── cal ...

  5. android判断参数非空,Android Studio注释模板Live Templates参数获取不到为null的一些

    Android Studio注释模板Live Templates参数获取不到为null的一些 Android Studio注释模板Live Templates参数获取不到为null的一些解决方法 提示 ...

  6. android xml获取指定,android:如何从xml文件中获取信息?

    我得到一个程序,从一个链接的服务器获取天气.我已经做了一些将字符串结合到URL的字符串.我现在需要从XML文件中获取信息.android:如何从xml文件中获取信息? 这是我的代码:(我更换了,为了安 ...

  7. android item 点击 获取position,Android ListView 子控件onClick正确获取position的方法

    在实际开发中,我们有时候不仅需要响应ListView的onItemClick,还需要响应其子控件的点击事件,这个时候我们就会 发现,由于复用等原因,如果直接在子控件的onClick事件中调用getVi ...

  8. android动态mac地址,Android 版本兼容 — Android 6.0 和 7.0后获取Mac地址

    Android 6.0 和 7.0后获取Mac地址 随着Android的版本迭代,获取设备的Mac地址也发生了改变.这里找到了最新的适配方案(适配当前的最新版本Android 9.0),并且记录了整个 ...

  9. Android手机HC-05蓝牙连接Arduino nano获取DHT-11温湿度传感器数据

    如果您觉得本文对您有用,希望您点赞,收藏并且把它分享出去,不明白的可以在评论区留言,我会一一解答,感谢您的支持!! 目标 Android手机HC-05蓝牙连接Arduino nano获取DHT-11温 ...

最新文章

  1. python unittest断言大全_Python-unittest框架 断言使用
  2. jQuery(function(){...})与(function($){...})(jQuery)的“兄弟”情结
  3. 微信支付 - 支付中心回调通知
  4. 酷派android是什么系统版本,酷派大神X7的手机系统是什么?能升级安卓5.0吗?
  5. 叮咚!你有一份来自明源云的圣诞邀约
  6. “约见”面试官系列之常见面试题第五篇说说vuex登录信息(建议收藏)
  7. 写了 10 年代码之后,我学到的 7 个绝对真理
  8. 防止表单按钮多次提交
  9. Intel 4004,世界上首个CPU,进不惑之年
  10. 高效实用Kafka-入门介绍
  11. 【万字长文】探讨可信构架之道
  12. 在线JSON转HTML,TABLE表格工具
  13. python代码翻译器-python写的翻译代码
  14. java keytool 导出证书,keytool 导出证书
  15. Nessus安装与使用
  16. html中div中加背景图片,div background css设置div背景图片
  17. excel的poi和EasyExcel的基本读写
  18. 小程序后端云开发(一)
  19. 知识点滴- BC和BCE的区别
  20. hibernate 一对多查询 对多的一方进行分页

热门文章

  1. Encoder-Decoder框架与Attention机制
  2. Android之UiAutomator测试框架源码分析(第二十四篇:ByMatcher相关功能介绍)
  3. 4位共阴极数码管的动态扫描电路VHDL设计
  4. ESP8266红外学习遥控器
  5. 信息安全——密码学(上)
  6. 基于Python实现的HTTP代理服务器设计
  7. Failed to decode response: zlib_decode(): data error Retrying with degraded mode, check
  8. Java API在HDFS上实现文件的上传、下载到本地、创建文件夹、删除文件和重命名文件
  9. matlab绘制空间摆线轨迹
  10. 高通820(msm8996)camera hal源码分析