《Android-自動填充驗證碼》

驗證碼自動填充首先應該考慮的就是如何獲取短信,而後讀取短信內容來實現。java

我能想到的有兩種方式。android

一、ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引發的數據庫的變化,繼而作一  些相應的處理,它相似於  數據庫技術中的觸發器(Trigger),當ContentObserver所觀察的Uri發生變化時,便會觸發它。數據庫

二、BroadcastReceiver——廣播。只要加入IntentFilter也能攔截部分本身想要作的事情。ide

下面我來一一介紹他們的實現:函數

ContentObserver:this

首先要定義一個ContentObserver的實現.net

import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;

import com.wumart.lib.common.DLog;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class SmsContent extends ContentObserver {
    public static final String SMS_URI_INBOX = "content://sms/inbox";//短信收信箱的URI
    public static final String SMS_ADDRESS = "電話號碼";//須要監聽的電話號碼
    private Context mContext;//內容上下文
    private SmsContentListener mSmsContentListener;//回調函數

    public SmsContent(Context context,SmsContentListener smsContentListener) {
        super(new Handler());
        this.mContext = context;
        this.mSmsContentListener=smsContentListener;
    }

     @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Cursor cursor = null;
        try {
            cursor = mContext.getContentResolver().query(Uri.parse(SMS_URI_INBOX), new String[]{"_id", "address", "body", "read"}, "address like ? and read=?",
                    new String[]{SMS_ADDRESS, "0"}, "date desc");
            if (cursor != null) {
                cursor.moveToFirst();
                if (cursor.moveToFirst()) {
                    String smsbody = cursor.getString(cursor.getColumnIndex("body"));
                    String smsContent = patternCode(smsbody);
                    if (null != mSmsContentListener && !TextUtils.isEmpty(smsContent))
                        mSmsContentListener.onSmsContentBack(smsContent);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != cursor)
                cursor.close();
        }
    }

    private  String patternCode(String patternContent) {
        if(TextUtils.isEmpty(patternContent))
            return null;
        Pattern p = Pattern.compile("(?<!\\d)\\d{6}(?!\\d)");
        Matcher matcher = p.matcher(patternContent);
        if (matcher.find())  return matcher.group();
        return null;
    }

    public interface SmsContentListener {
        void onSmsContentBack(String result);
    }
}

固然還需在activity或者fragment中來調用它code

SmsContent mSmsContent=new SmsContent(this, this) 
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, mSmsContent);
在onDestroy的時候仍是須要
getContentResolver().unregisterContentObserver(mSmsContent)

BroadcastReceiver:server

首先初始化廣播get

public static final String PHONE="電話號碼";
 //短信驗證碼內容 驗證碼是6位數字的格式
    private String strContent;
    private String patternCoder = "(?<!\\d)\\d{6}(?!\\d)";
 private BroadcastReceiver smsReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Object[] objs = (Object[]) intent.getExtras().get("pdus");
            for (Object obj : objs) {
                byte[] pdu = (byte[]) obj;
                SmsMessage sms = SmsMessage.createFromPdu(pdu);
                // 短信的內容
                String message = sms.getMessageBody();
                String from = sms.getOriginatingAddress();
                if (!ScrmUtil.isEmpty(from) && from.startsWith(PHONE)) {
                    String code = patternCode(message);
                    if (!ScrmUtil.isEmpty(code)) {
                        strContent = code;
                        mHandler.sendEmptyMessage(1);
                    }
                }
            }
        }
    };

//主要是更新UI
 private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            if (codeEdtv != null) {
                codeEdtv.setText(strContent);
                codeEdtv.setClearIconVisible(false);
            }
            try {
                unregisterReceiver(smsReceiver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    };

  /**
     * 匹配短信中間的6個數字(驗證碼等)
     */
    private String patternCode(String patternContent) {
        if (ScrmUtil.isEmpty(patternContent))  return null;
        Pattern p = Pattern.compile(patternCoder);
        Matcher matcher = p.matcher(patternContent);
        if (matcher.find())  return matcher.group();
        return null;
    }

而後在activity中和fragment中註冊廣播

public void addReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        filter.setPriority(Integer.MAX_VALUE);
        registerReceiver(smsReceiver, filter);

    }

在onDestroy也仍是須要取消監聽,否則會出問題
 unregisterReceiver(smsReceiver);

以上就是自動填充驗證碼的辦法了。寫得不是很好,但願你們指教

相關文章
相關標籤/搜索