文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android 手机获取手机号实现方法

2022-06-06 07:33

关注

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

网上不符合需求的方法

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


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

添加权限:

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

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

原因好像、似乎是:

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

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

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

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

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

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

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

程序如何实现?

1.监听短信类


package com.example.smsmanager; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.SmsMessage; 
public class SMS_Receiver extends BroadcastReceiver { 
 final String GetNumberAddress="10001"; 
 @Override 
 public void onReceive(Context context, Intent intent) { 
  // TODO Auto-generated method stub 
  if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){ 
   Object[] pdus=(Object[])intent.getExtras().get("pdus"); 
   //不知道为什么明明只有一条消息,传过来的却是数组,也许是为了处理同时同分同秒同毫秒收到多条短信 
   //但这个概率有点小 
   SmsMessage[] message=new SmsMessage[pdus.length]; 
   StringBuilder sb=new StringBuilder(); 
   System.out.println("pdus长度"+pdus.length); 
   String address=""; 
   for(int i=0;i<pdus.length;i++){ 
    //虽然是循环,其实pdus长度一般都是1 
    message[i]=SmsMessage.createFromPdu((byte[])pdus[i]); 
    sb.append("接收到短信来自:\n"); 
    address=message[i].getDisplayOriginatingAddress(); 
    sb.append(address+"\n"); 
    sb.append("内容:"+message[i].getDisplayMessageBody()); 
   } 
   System.out.println(sb.toString()); 
   if(SMSCore.PhoneNumber==""&&address.equals(GetNumberAddress)){ 
    SMSCore.PhoneNumber=SMSCore.GetPhoneNumberFromSMSText(sb.toString()); 
    MessageTools.ShowDialog(context, address); 
   } 
   MessageTools.ShowDialog(context, sb.toString().trim()); 
   MessageTools.ShowDialog(context, SMSCore.PhoneNumber); 
  } 
 } 
} 

2.短信操作类


package com.example.smsmanager; 
import java.sql.Date; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.content.BroadcastReceiver; 
import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.content.ContextWrapper; 
public class SMSCore { 
  public static String PhoneNumber=""; 
  //==============Get Phone Number ============================== 
  //get the phone number from sms 
  public static String GetPhoneNumberFromSMSText(String sms){ 
   List<String> list=GetNumberInString(sms); 
   for(String str:list){ 
    if(str.length()==11) 
     return str; 
   } 
   return ""; 
  } 
  public static List<String> GetNumberInString(String str){ 
   List<String> list=new ArrayList<String>(); 
    String regex = "\\d*"; 
      Pattern p = Pattern.compile(regex); 
      Matcher m = p.matcher(str); 
      while (m.find()) { 
      if (!"".equals(m.group())) 
       list.add(m.group()); 
       } 
      return list; 
  } 
  //=========================================================== 
  // 
  // 
  //=============Send SMS================ 
  public void SendSMS(String number,String text,Context context){ 
   PendingIntent pi = PendingIntent.getActivity(context, 0, 
     new Intent(context, context.getClass()), 0); 
   SmsManager sms = SmsManager.getDefault(); 
   sms.sendTextMessage(number, null, text, pi, null); 
  } 
  public void SendSMS2(String number,String text,Context context){ 
   String SENT = "sms_sent"; 
   String DELIVERED = "sms_delivered"; 
   PendingIntent sentPI = PendingIntent.getActivity(context, 0, new Intent(SENT), 0); 
   PendingIntent deliveredPI = PendingIntent.getActivity(context, 0, new Intent(DELIVERED), 0); 
//   
//   // 
//   registerReceiver(new BroadcastReceiver(){ 
//     @Override 
//     public void onReceive(Context context, Intent intent){ 
//      switch(getResultCode()) 
//      { 
//       case Activity.RESULT_OK: 
//        Log.i("====>", "RESULT_OK"); 
//        System.out.println("RESULT_OK"); 
//        
//        break; 
//       case Activity.RESULT_CANCELED: 
//        Log.i("=====>", "RESULT_CANCELED"); 
//        break; 
//      } 
//     } 
//    }, new IntentFilter(DELIVERED)); 
//   // 
   SmsManager smsm = SmsManager.getDefault(); 
   smsm.sendTextMessage(number, null, text, sentPI, deliveredPI); 
  } 
  //===================================== 
} 

3.弹出框操作类


package com.example.smsmanager; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
public class MessageTools { 
 public static void ShowDialog(Context context, String text){ 
  AlertDialog.Builder builder = new Builder(context); 
   builder.setMessage(text); 
   builder.setTitle("提示"); 
   builder.setPositiveButton("确认", new OnClickListener() { 
   @Override 
   public void onClick(DialogInterface dialog, int which) { 
   dialog.dismiss(); 
   dialog.dismiss(); 
   } 
   }); 
   builder.setNegativeButton("取消", new OnClickListener() { 
   @Override 
   public void onClick(DialogInterface dialog, int which) { 
   dialog.dismiss(); 
   } 
   }); 
   builder.create().show(); 
 } 
} 

4.调用如下:


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

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

 运行结果:

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

以上就是Android 获取手机号的实现代码,希望能帮助有需要的朋友,谢谢大家对本站的支持!

您可能感兴趣的文章:Android实现通讯录效果——获取手机号码和姓名Android基于APN获取手机号的方法Android获取手机号码和运营商信息的方法android 获取本机的IP地址和mac物理地址的实现方法Android NDK开发详细介绍Android中获取设备的各种信息总结Android onCreate( )方法详细介绍


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯