android手机获取手机号

news/2024/12/14 11:03:40/

最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。

网上不符合需求的方法

Google了一下,网上的做法如下: 

  1. //获取手机号码  
  2. TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);  
  3.   String deviceid = tm.getDeviceId();//获取智能设备唯一编号  
  4.   String te1  = tm.getLine1Number();//获取本机号码  
  5.   String imei = tm.getSimSerialNumber();//获得SIM卡的序号  
  6.   String imsi = tm.getSubscriberId();//得到用户Id  

添加权限: 

  1. <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.READ_PHONE_STATE"/  

以上做法有可能获取sim卡号,但是现在最起码在电信手机卡上获取不到。

原因好像、似乎是:

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

那么我们怎么解决这个问题呢?

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

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

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

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

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

程序如何实现?

 

1.监听短信类 

  1. package com.example.smsmanager;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.telephony.SmsMessage;  
  7.   
  8. public class SMS_Receiver extends BroadcastReceiver {  
  9.   
  10.     final String GetNumberAddress="10001";  
  11.     @Override  
  12.     public void onReceive(Context context, Intent intent) {  
  13.         // TODO Auto-generated method stub  
  14.         if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){  
  15.               
  16.             Object[] pdus=(Object[])intent.getExtras().get("pdus");  
  17.             //不知道为什么明明只有一条消息,传过来的却是数组,也许是为了处理同时同分同秒同毫秒收到多条短信  
  18.             //但这个概率有点小  
  19.             SmsMessage[] message=new SmsMessage[pdus.length];  
  20.             StringBuilder sb=new StringBuilder();  
  21.             System.out.println("pdus长度"+pdus.length);  
  22.             String address="";  
  23.             for(int i=0;i<pdus.length;i++){  
  24.                 //虽然是循环,其实pdus长度一般都是1  
  25.                 message[i]=SmsMessage.createFromPdu((byte[])pdus[i]);  
  26.                 sb.append("接收到短信来自:\n");  
  27.                 address=message[i].getDisplayOriginatingAddress();  
  28.                 sb.append(address+"\n");  
  29.                 sb.append("内容:"+message[i].getDisplayMessageBody());  
  30.             }  
  31.             System.out.println(sb.toString());  
  32.             if(SMSCore.PhoneNumber==""&&address.equals(GetNumberAddress)){  
  33.                 SMSCore.PhoneNumber=SMSCore.GetPhoneNumberFromSMSText(sb.toString());  
  34.                 MessageTools.ShowDialog(context, address);  
  35.             }  
  36.             MessageTools.ShowDialog(context, sb.toString().trim());  
  37.             MessageTools.ShowDialog(context, SMSCore.PhoneNumber);  
  38.         }  
  39.     }  
  40.   
  41. }  



2.手机号码购买操作类 

  1. package com.example.smsmanager;  
  2.   
  3. import java.sql.Date;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.regex.Matcher;  
  7. import java.util.regex.Pattern;  
  8.   
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.content.BroadcastReceiver;  
  12. import android.app.Activity;  
  13. import android.app.PendingIntent;  
  14. import android.content.Context;  
  15. import android.content.Intent;  
  16. import android.content.IntentFilter;  
  17. import android.telephony.SmsManager;  
  18. import android.util.Log;  
  19. import android.content.ContextWrapper;  
  20.   
  21. public class SMSCore {  
  22.       
  23.         public static String PhoneNumber="";  
  24.         //==============Get Phone Number ==============================  
  25.           
  26.         //get the phone number from sms  
  27.         public static String GetPhoneNumberFromSMSText(String sms){  
  28.               
  29.             List<String> list=GetNumberInString(sms);  
  30.             for(String str:list){  
  31.                 if(str.length()==11)  
  32.                     return str;  
  33.             }  
  34.             return "";  
  35.         }  
  36.         public static List<String> GetNumberInString(String str){  
  37.             List<String> list=new ArrayList<String>();  
  38.                 String regex = "\\d*";  
  39.                         Pattern p = Pattern.compile(regex);  
  40.   
  41.                         Matcher m = p.matcher(str);  
  42.   
  43.                         while (m.find()) {  
  44.                         if (!"".equals(m.group()))  
  45.                          list.add(m.group());  
  46.                           }  
  47.                       return list;  
  48.         }  
  49.           
  50.         //===========================================================  
  51.         //  
  52.         //  
  53.         //=============Send SMS================  
  54.         public  void SendSMS(String number,String text,Context context){  
  55.                
  56.             PendingIntent pi = PendingIntent.getActivity(context, 0,  
  57.                     new Intent(context, context.getClass()), 0);  
  58.             SmsManager sms = SmsManager.getDefault();  
  59.             sms.sendTextMessage(number, null, text, pi, null);  
  60.   
  61.         }  
  62.           
  63.         public void SendSMS2(String number,String text,Context context){  
  64.             String SENT = "sms_sent";  
  65.             String DELIVERED = "sms_delivered";  
  66.             PendingIntent sentPI = PendingIntent.getActivity(context, 0, new Intent(SENT), 0);  
  67.             PendingIntent deliveredPI = PendingIntent.getActivity(context, 0, new Intent(DELIVERED), 0);  
  68. //            
  69. //          //  
  70. //           registerReceiver(new BroadcastReceiver(){  
  71. //                  @Override  
  72. //                  public void onReceive(Context context, Intent intent){  
  73. //                      switch(getResultCode())  
  74. //                      {  
  75. //                          case Activity.RESULT_OK:  
  76. //                              Log.i("====>", "RESULT_OK");  
  77. //                              System.out.println("RESULT_OK");  
  78. //                                
  79. //                              break;  
  80. //                          case Activity.RESULT_CANCELED:  
  81. //                              Log.i("=====>", "RESULT_CANCELED");  
  82. //                              break;  
  83. //                      }  
  84. //                  }  
  85. //              }, new IntentFilter(DELIVERED));  
  86. //            //  
  87.               
  88.             SmsManager smsm = SmsManager.getDefault();  
  89.             smsm.sendTextMessage(number, null, text, sentPI, deliveredPI);  
  90.         }  
  91.           
  92.         //=====================================  
  93. }  

3.弹出框操作类 

  1. package com.example.smsmanager;  
  2.   
  3. import android.app.AlertDialog;  
  4. import android.app.AlertDialog.Builder;  
  5. import android.content.Context;  
  6. import android.content.DialogInterface;  
  7. import android.content.DialogInterface.OnClickListener;  
  8.   
  9. public class MessageTools {  
  10.     public static void ShowDialog(Context context, String text){  
  11.         AlertDialog.Builder builder = new Builder(context);  
  12.           builder.setMessage(text);  
  13.   
  14.           builder.setTitle("提示");  
  15.   
  16.           builder.setPositiveButton("确认", new OnClickListener() {  
  17.   
  18.            @Override  
  19.            public void onClick(DialogInterface dialog, int which) {  
  20.             dialog.dismiss();  
  21.   
  22.             dialog.dismiss();  
  23.            }  
  24.           });  
  25.   
  26.           builder.setNegativeButton("取消", new OnClickListener() {  
  27.   
  28.            @Override  
  29.            public void onClick(DialogInterface dialog, int which) {  
  30.             dialog.dismiss();  
  31.            }  
  32.           });  
  33.   
  34.           builder.create().show();  
  35.     }  
  36. }  


 

4.调用如下: 

  1. //  
  2.     private static final String ACTION_SMS_SEND = "lab.sodino.sms.send";    
  3.     private static final String ACTION_SMS_DELIVERY = "lab.sodino.sms.delivery";    
  4.     private static final String ACTION_SMS_RECEIVER = "android.provider.Telephony.SMS_RECEIVED";  

  1. // 注册接收下行receiver    
  2.        SMS_Receiver smsReceiver= new SMS_Receiver();    
  3.        IntentFilter receiverFilter = new IntentFilter(ACTION_SMS_RECEIVER);    
  4.        registerReceiver(smsReceiver, receiverFilter);    
  5. //发送短信  
  6. SMSCore smscore=new SMSCore();  
  7. smscore.SendSMS2("10001", "501", context);  

运行结果:

我们可以得到了想要的手机号码了!


http://www.ppmy.cn/news/366948.html

相关文章

Windows上安装绿色版mysql-8.0.26

以8.0.26为例 1.安装包下载 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/下载后文件如图所示&#xff1a; 解压压缩包&#xff0c;并修改文件夹名称为mysql&#xff1a; 2.创建配置文件 在E:\mysql&#xff08;MySQL解压目录&#xff09;文件夹下&#…

华为手机桌面有计算机的数字,华为手机桌面上信息图标上显示的数字角标如何关闭...

华为手机桌面上信息图标上显示的数字角标如何关闭 今天给大家介绍一下华为手机桌面上信息图标上显示的数字角标如何关闭的具体操作步骤。 1. 打开手机,进入桌面,在桌面空白处,长按; 2. 在打开的页面,右下角点击三竖点的设置图标; 3. 如图,进入设置页面后,找到“图标角标…

为什么手机收不到验证码,怎么处理?

大家在网上注册的时候&#xff0c;常常被要求输入验证码&#xff0c;但是有时候却一直没有等到验证码&#xff0c;这是什么原因呢&#xff1f; 1、手机号码被运营商屏蔽 手机号码被运营商屏蔽的原因可能是你之前曾经此类的短信向运营商投诉为垃圾短信&#xff0c;使得短信被运营…

H5+js实现摇晃手机,手机震动

HTML5一个重要特性就是DeviceOrientation&#xff0c;它将底层的方向传感器和运动传感器进行了高级封装&#xff0c;提供了DOM事件的支持。这个特性包括两种事件&#xff1a; 1、 deviceOrientation&#xff1a;封装了方向传感器数据的事件&#xff0c;可以获取手机静止状态下…

鸿蒙有没有手机管家,鸿蒙2.0手机快了,华为EMUI 11透露关键信息

鸿蒙2.0手机快了&#xff0c;华为EMUI 11透露关键信息是由电脑报的小编精心推荐&#xff0c;希望以下资讯对你能带来参考借鉴作用。 在9月10日的华为2020开发者大会上&#xff0c;华为正式发布了鸿蒙2.0操作系统&#xff0c;并第一次明确了鸿蒙手机的日程。 根据余承东公布的鸿…

手机动态码登录

产生背景 和移动互联网的兴起有直接关系&#xff0c;国内的众多网民直接从移动设备触网&#xff0c;手机自动的手机号码天然具备校验身份的优势因为办理手机号时需要提供身份证&#xff0c;所以手机号满足了国家关于实名制的要求。这促进了手机动态码登录的推广 优缺点 优点 手…

ASP.NET发送手机短信验证码

我们在做网站尤其是用户注册时难免会用到使用手机号注册&#xff0c;给用户发送验证码用于效验身份。因为要用到给手机发送短信&#xff0c;所以需求运营商提供接口&#xff08;当然这个需要一定的费用^-^&#xff09;。 下面是实现方案&#xff1a; 一、web.config中需要增加…

如何用代码实现手机接收动态验证码

如何用代码实现手机接收动态验证码 我们现在注册一个app应用经常会使用手机验证码,那Java程序怎么实现的呢? 首先我们要明白,手机接收验证码是基于三大运营商的服务实现的,而阿里云服务为我们实现了免去和运营商直接合作的麻烦以及费用等各种限制. 在这里我们可以注册一个阿里…