Android 手机获取手机号实现方法
最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。
网上不符合需求的方法
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 获取手机号的实现代码,希望能帮助有需要的朋友,谢谢大家对本站的支持!
上一篇: php获取指定数量随机字符串的方法