安卓 获取手机号码代码

现在版本的系统是不是不能用getLine1Number 获取到了。还可以通过手机短信获取,此方法有人验证过吗?

获取不了用户自己的手机号码 getLine1Number返回空值

手机上测试 返回都是空值,查了类库,好像这个getLine1Number 是获取手机号码的唯一方法. 郁闷。。。 代码如下:
TelephonyManager tm = (TelephonyManager) getSystemService (Context.TELEPHONY_SERVICE);

      //获取手机号码

    String phoneNumber = tm.getLine1Number();
    if(phoneNumber == null || phoneNumber.trim().equals("")){
            phoneNumber = "不能获取到手机号码";
            }

权限已加

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

这些我都找过了。现在手机卡都加密放到手机sim卡还是。通过联通以后通信知道本机号码。这2种说法都有的。你们发的都是用那个方法获取本机号码。现在好像都不可以获取本机号码,是吗

直接在本机是获取不到本机号码的,因为,SIM卡只是记录了一个唯一的标识号,并不记录手机号码,手机号码是在用手机打电话时,SIM卡号被发送到服务商,服务商通过SIM卡号查询数据库中关联的电话号码

因此,在所有的注册手机号码的APP中,包括各种经典大厂的APP如果不发短信的话都是需要手工写入手机号码的

要自动化的唯一方法就是自动发送一个带有唯一标识的短信(比如SIM卡号)或拨打一个电话,通过被呼叫端获得的号码,就是本机的号吗了,然后存储在服务器中,之后通过网络查询即可取得本机号码

直接在本机是获取不到本机号码的,因为,SIM卡只是记录了一个唯一的标识号,并不记录手机号码,手机号码是在用手机打电话时,SIM卡号被发送到服务商,服务商通过SIM卡号查询数据库中关联的电话号码

因此,在所有的注册手机号码的APP中,包括各种经典大厂的APP如果不发短信的话都是需要手工写入手机号码的

要自动化的唯一方法就是自动发送一个带有唯一标识的短信(比如SIM卡号)或拨打一个电话,通过被呼叫端获得的号码,就是本机的号吗了,然后存储在服务器中,之后通过网络查询即可取得本机号码

试试这个

TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String deviceid = tm.getDeviceId();
String te1 = tm.getLine1Number();
String imei = tm.getSimSerialNumber();
String imsi = tm.getSubscriberId(); 以上代码是获取本机号码的。记得加权限