讀取短信驗證碼並自動設置給文本框

轉自好友http://blog.csdn.net/cool_fuwei/article/details/50455898
最近項目中用到自動讀取短信驗證碼這一功能,本人自己封裝了一個工具類,可以直接拿來用,源碼如下:

import android.app.Activity;
import android.content.ContentValues;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.widget.EditText;

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

/**
 * 讀取短信驗證碼,並設置驗證碼
 * Created by cool on 2016/1/4.
 */
public class ReadSmsContent extends ContentObserver {
    private Cursor cursor = null;
    private Activity mActivity;
    private EditText mEditText;

    public ReadSmsContent(Handler handler,Activity activity,EditText editText) {
        super(handler);
        this.mActivity = activity;
        this.mEditText = editText;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Log.e("tag", "onChange");
        // 讀取收件箱中指定號碼的短信
        cursor = mActivity.managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "body", "read"}, null, null, "_id desc");

        if (cursor != null && cursor.getCount() > 0) {
            ContentValues values = new ContentValues();
            values.put("read", "1");        //修改短信爲已讀模式
            cursor.moveToNext();
            int smsbodyColumn = cursor.getColumnIndex("body");
            String smsBody = cursor.getString(smsbodyColumn);
            Log.e("qqq", "smsBody :" + smsBody);
            String verifyCode = getDynamicPassword(smsBody);
            if(TextUtils.isEmpty(verifyCode)){
                return;
            }
            if(mEditText == null) {
                throw new RuntimeException("你傳的EditText爲空");
            }
                mEditText.setText(verifyCode);
                //EditText獲取焦點,3個屬性必須同時設置
                  mEditText.setFocusable(true);
                mEditText.setFocusableInTouchMode(true);
                mEditText.requestFocus();
                mEditText.setSelection(verifyCode.length());//設置光標位置
        }
        //在用managedQuery的時候,不能主動調用close()方法, 否則在Android 4.0+的系統上,         會發生崩潰
        if (Build.VERSION.SDK_INT < 14) {
            cursor.close();
        }
    }

        /**
         * 從字符串中截取連續4位數字
         * 用於從短信中獲取動態密碼
         *
         * @param str 短信內容
         * @return 截取得到的4位動態密碼
         */
    public String getDynamicPassword(String str) {
        Pattern continuousNumberPattern = Pattern.compile("[0-9\\.]+");
        Matcher m = continuousNumberPattern.matcher(str);
        String dynamicPassword = "";
        while (m.find()) {
            if (m.group().length() == 4) {
                dynamicPassword = m.group();
            }
        }

        return dynamicPassword;
    }
}

該工具類的使用:
在Activity的onCreate方法中註冊

readSmsContent = new ReadSmsContent(new Handler(),this,mVerifyCodeEditText);

//註冊短信內容監聽

this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, readSmsContent);

在Activity的onDestroy中註銷監聽
//註銷內容監聽者

this.getContentResolver().unregisterContentObserver(readSmsContent);

需要的權限:

  <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
發佈了45 篇原創文章 · 獲贊 36 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章