android短信驗證碼自動填寫

首先學習一下觀察者模式:

觀察者模式是軟件設計模式中的一種,在此種模式下,一個目標物件管理所有相依於它的觀察者物件,並且在他本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法
來實現。此種模式通常被用來實現事件處理系統。
觀察者模式(Observer)完美的將觀察者和被觀察者的對象分離開,在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。
觀察者設計模式定義了對象間的一種一對多的依賴關係,以便一個對象的狀態發生變化時,所有依賴於它的對象都得到通知並自動刷新。

ContentObserver

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

觀察特定Uri的步驟如下:
1.創建我們特定的ContentObserver派生類,必須重載父類構造方法,必須重載onChange()方法去處理回調後的功能實現。
2.利用context.getContentResolover()獲得ContentResolover對象,接着調用registerContentObserver()方法去註冊內容觀察者。
3.由於ContentObserver的生命週期不同步於Acitivity和Service等,因此,在 不需要時,需要手動的調用unregisterContentObserver()去取消註冊。

1.編寫SmsContentObserver類

public class SmsObserver extends ContentObserver {

    private Context mContext;
    private Handler mHandler;

    public SmsObserver(Context context ,Handler handler){
        super(handler);
        mContext = context;
        mHandler = handler;

    }


    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);

        Log.e("DEBUG", "sms has changed");
        Log.e("DEBUG",uri.toString());

        String code = "";

        //短信變化發出第一個變化是下面的uri,但這時短信並未寫入到數據庫中,因此這次變化不能做出回調
        if ((uri.toString()).equals("content://sms/raw")){
            return;
        }

        Uri inboxUri = Uri.parse("content://sms/inbox");
        Cursor c = mContext.getContentResolver().query(inboxUri,null,null,null,"date desc");//按日期倒序排列
        if (c!=null){
            if (c.moveToFirst()){
                String address =  c.getString(c.getColumnIndex("address"));
                String body = c.getString(c.getColumnIndex("body"));

                //判斷髮件人
                if (!address.equals("15566668888")){
                    return;
                }

                Log.e("DEBUG", "發件人爲:" + address + "   " + "短信內容:" + body);

                Pattern pattern = Pattern.compile("(\\d{6})");//這個正則表達式就是指提取連續6個數字
                Matcher matcher = pattern.matcher(body);

                if (matcher.find()){
                    code = matcher.group(0);
                    Log.e("DEBUG","code is "+code);

                    mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE,code).sendToTarget();

                }

            }
            c.close();
        }

    }
}

2.註冊observer

 //註冊observer
        mObserver = new SmsObserver(MainActivity.this,mHandler);
        Uri uri = Uri.parse("content://sms");//這個uri指代的就是我們的短信
        getContentResolver().registerContentObserver(uri, true , mObserver);

3.最後使用handler修改UI

private Handler mHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MSG_RECEIVED_CODE){
                String code = (String) msg.obj;
                //update UI
                mEditText.setText(code);

                Toast.makeText(MainActivity.this,code,Toast.LENGTH_LONG).show();

            }
        }
    };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章