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:name="android.permission.READ_PHONE_STATE"/

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

原因好像、似乎是:

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

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

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

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

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

android手机获取手机号_第1张图片

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

如果是联通或者移动应该也是有类似的情况。何况给他们发短信应该不会收费。。。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手机获取手机号_第2张图片



你可能感兴趣的:(android,短信,手机号码)