欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-06 22:34:32
最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。 网上不符合需求的方法 google了一下,网上的做法如下: //获取手机号码...

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

网上不符合需求的方法

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会给你个反馈信息,其中包含手机号码

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

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

如果是联通或者移动应该也是有类似的情况。何况给他们发短信应该不会收费。。。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 获取手机号的实现代码,希望能帮助有需要的朋友,谢谢大家对本站的支持!