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會給你個反饋信息,其中包含手機號碼

vcrWu/q6xcHLoaM8L3A+CjxwPsjnufvKx8Gqzai78tXf0sa2r9OmuMPSssrH09DA4CYjMjAyODQ7tcTH6b/2oaO6zr/2uPjL+8PHt6K2zNDF06a4w7K7u+HK1bfRoaOho6GjTyihyV+hySlPfjwvcD4KPHA+PHN0cm9uZz6zzNDyyOe6zsq1z9ajvzwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz48YnI+Cjwvc3Ryb25nPjwvcD4KPHA+MS684Mz9tszQxcDgPC9wPgo8cD48c3Ryb25nPjwvc3Ryb25nPjwvcD4KPHByZSBjbGFzcz0=”brush:java;”>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 list=GetNumberInString(sms);
			for(String str:list){
				if(str.length()==11)
					return str;
			}
			return "";
		}
		public static List GetNumberInString(String str){
			List list=new ArrayList();
		        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);

運行結果:

我們可以得到瞭想要的手機號碼瞭!

發佈留言