首页 → 软件编程 → Android → 正文内容 android手机获取手机号
http://www.jb51.net/article/92151.htm
最近做到一个项目,需要获取手机号。项目中使用的手机卡为电信卡,那么就以此为例吧。
网上不符合需求的方法
Google了一下,网上的做法如下:
1
2
3
4
5
6
|
//获取手机号码 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.监听短信类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
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.短信操作类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
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.弹出框操作类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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.调用如下:
1
2
3
4
5
|
// 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" ; |
1
2
3
4
5
6
7
|
// 注册接收下行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); |
运行结果:
我们可以得到了想要的手机号码了!