短信自動填充

用到ContentObserver的觀察者模式

1、創建短信觀察者

public class SmsObserver extends ContentObserver {

    private Context mContext;
    private Handler mHandler;
    private String code = "";

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

    /**
     * 需要觀察的被觀察對象發生變化的時候會自動調用的函數
     *
     * @param selfChange 本身是否發生變化
     * @param uri        相應的Uri
     */
    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);

        //第一遍執行時短信還未寫到數據庫中,所以忽略第一遍
        if (uri.toString().equals("content://sms/raw")) {
            return;
        }
        //讀取短信
        //收件箱的uri
        Uri inboxUri = Uri.parse("content://sms/inbox");
        //遊標查詢數據庫  date desc按日期倒敘排列
        Cursor cursor = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");
        if (cursor != null) {
            if (cursor.moveToFirst()) {//將遊標移動到第一條(判斷數據庫裏是否有數據)
                String address = cursor.getString(cursor.getColumnIndex("address"));//收件人
                String body = cursor.getString(cursor.getColumnIndex("body"));//具體內容
                //使用正則表達式對驗證碼進行提取
                Pattern pattern = Pattern.compile("(\\d{5})");//提取短信中連續6個數字的內容
                Matcher matcher = pattern.matcher(body);
                if (matcher.find()) {//匹配
                    code = matcher.group(0);
                    mHandler.obtainMessage(ContactStateActivity.MESSAGE_CODE, code).sendToTarget();
                }
            }
            cursor.close();
        }
    }
}

2、註冊

        smsObserver = new SmsObserver(this, handler);
        //當短信的收件、發件發生變化時都會反映到這個uri上
        Uri uri = Uri.parse("content://sms");
        //註冊
        getContentResolver().registerContentObserver(uri, true, smsObserver);

3、解註冊

 @Override
    protected void onPause() {
        super.onPause();
        getContentResolver().unregisterContentObserver(smsObserver);
    }

4、獲得值更新UI

@SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==MESSAGE_CODE){
                String code = (String) msg.obj;
                etCodeNum.setText(code);
            }
        }
    };

5、記得申請短信讀取權限(6.0以上要動態活獲取)

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

目前華爲等手機有對短信驗證碼的保護,防止第三方竊取等,可以先在短信設置裏面關掉再試試。

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