当前位置: 移动技术网 > IT编程>移动开发>Android > Android 手机获取手机号实现方法

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

高福平,康熙来了20130304,养生小常识

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

网上不符合需求的方法

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 获取手机号的实现代码,希望能帮助有需要的朋友,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网