android獲取短信驗證碼並自動填寫的實現一

現在的應用在註冊登錄或者修改密碼中都用到了短信驗證碼,那在android中是如何實現獲取短信驗證碼並自動填寫的呢?


首先,需要要在manifest中註冊接收和讀取短信的權限:



<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
    <uses-permission android:name="android.permission.READ_SMS"/>


實現一個廣播SMSBroadcastReceiver來監聽短信: 



package com.example.receive;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;


/**
 * 短信監聽
 * @author 
 *
 */
public class SMSBroadcastReceiver extends BroadcastReceiver {
	
    private static MessageListener mMessageListener;
    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
	
	public SMSBroadcastReceiver() {
        super();
    }

	@Override
	public void onReceive(Context context, Intent intent) {
	        if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
	            Object[] pdus = (Object[]) intent.getExtras().get("pdus");
	            for(Object pdu:pdus) {
	                SmsMessage smsMessage = SmsMessage.createFromPdu((byte [])pdu);
	                String sender = smsMessage.getDisplayOriginatingAddress();
	                //短信內容
	                String content = smsMessage.getDisplayMessageBody();
	                long date = smsMessage.getTimestampMillis();
	                Date tiemDate = new Date(date);
	                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	                String time = simpleDateFormat.format(tiemDate);

	                //過濾不需要讀取的短信的發送號碼
	                if ("+8613450214963".equals(sender)) {
	                    mMessageListener.onReceived(content);
	                    abortBroadcast();
	                }
	            }
	        }
	    
	}
	
	//回調接口
    public interface MessageListener {
        public void onReceived(String message);
    }
    
    public void setOnReceivedMessageListener(MessageListener messageListener) {
        this.mMessageListener = messageListener;
    }
}


在需要填寫驗證碼的Activity中,生產SMSBroadcastReceiver的實例,實現onReceived的回調接口。爲了節約系統資源,我們使用動態註冊註銷廣播的方法。 


package com.example.smstest;

import com.example.receive.SMSBroadcastReceiver;

import android.os.Bundle;
import android.app.Activity;
import android.content.IntentFilter;
import android.view.Menu;
import android.widget.EditText;

public class MainActivity extends Activity {
	
	private EditText edtPassword;
	private SMSBroadcastReceiver mSMSBroadcastReceiver;
	
	private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		edtPassword = (EditText) findViewById(R.id.password);
	}
	
	@Override
	protected void onStart() {
        super.onStart();
        //生成廣播處理
        mSMSBroadcastReceiver = new SMSBroadcastReceiver();

        //實例化過濾器並設置要過濾的廣播
        IntentFilter intentFilter = new IntentFilter(ACTION);
        intentFilter.setPriority(Integer.MAX_VALUE);
        //註冊廣播
        this.registerReceiver(mSMSBroadcastReceiver, intentFilter);

        mSMSBroadcastReceiver.setOnReceivedMessageListener(new SMSBroadcastReceiver.MessageListener() {
            @Override
            public void onReceived(String message) {

            	edtPassword.setText(message);

            }
        });
    }
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		 //註銷短信監聽廣播
        this.unregisterReceiver(mSMSBroadcastReceiver);
	}
}

第二種方法是通過監聽短信庫的變化,使用 短信觀察者
  1. ContentObserver c=new ContentObserver(han) {  
  2.                 @Override  
  3.                 public void onChange(boolean selfChange) {  
  4.                     // TODO Auto-generated method stub  
  5.                     super.onChange(selfChange);  
  6.                     han.sendEmptyMessage(0);  
  7.                 }  
  8.             };  
  9. getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, c);  
  10.   
  11.   
  12. Handler han = new Handler() {  
  13.         @SuppressWarnings("deprecation")  
  14.         public void handleMessage(android.os.Message msg) {  
  15.             String codestr = null;  
  16.             try {  
  17.                 codestr = Cus_UnitTools.getsmsyzm(Reg_ForgetPassword.this);  
  18.                 code.setText(codestr);  
  19.                 requestcode();  
  20.             } catch (Exception e) {  
  21.                 Log.e("yung""驗證碼提取失敗:" + codestr);  
  22.             }  
  23.         };  
  24.     };    
  25.   
  26.     public static String getsmsyzm(Activity c) {  
  27.         Uri uri = Uri.parse("content://sms/inbox");  
  28.         String[] projection = new String[] { "address""person""body" };  
  29.         String selection = " address='" + JTPHONE + "' ";  
  30.         String[] selectionArgs = new String[] {};  
  31.         String sortOrder = "date desc";  
  32.         @SuppressWarnings("deprecation")  
  33.         Cursor cur = c.managedQuery(uri, projection, selection, selectionArgs,  
  34.                 sortOrder);  
  35.         if(cur!=null&&cur.getCount()>0){  
  36.             cur.moveToFirst();  
  37.             String body = cur.getString(cur.getColumnIndex("body")).replaceAll(  
  38.                     "\n"" ");  
  39.             cur.close();  
  40.             return getyzm(body, YZMLENGTH);  
  41.     }  
  42.         cur.close();  
  43.         return null;  
  44.     }  
  45.   
  46.   
  47.         /** 
  48.      * 從短信字符竄提取驗證碼 
  49.      * @param body 短信內容  
  50.          * @param YZMLENGTH  驗證碼的長度 一般6位或者4位 
  51.      * @return 接取出來的驗證碼 
  52.      */  
  53.     public static String getyzm(String body, int YZMLENGTH) {  
  54.         // 首先([a-zA-Z0-9]{YZMLENGTH})是得到一個連續的六位數字字母組合  
  55.         // (?<![a-zA-Z0-9])負向斷言([0-9]{YZMLENGTH})前面不能有數字  
  56.         // (?![a-zA-Z0-9])斷言([0-9]{YZMLENGTH})後面不能有數字出現  
  57.         Pattern p = Pattern  
  58.                 .compile("(?<![a-zA-Z0-9])([a-zA-Z0-9]{" + YZMLENGTH + "})(?![a-zA-Z0-9])");  
  59.         Matcher m = p.matcher(body);  
  60.         if (m.find()) {  
  61.             System.out.println(m.group());  
  62.             return m.group(0);  
  63.         }  
  64.         return null;  
  65.     }  
請參考 http://blog.csdn.net/yung7086/article/details/26094987
發佈了21 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章