Android 自動獲取驗證碼的兩種方式分別是BroadcastReceiver及ContentObserver,兩種方式都需要進行注冊、取消注冊兩個步驟
記得添加權限,本文介紹ContentObserver方式。
照舊先上ContentObserver代碼
/** * Created by weifeiyang on 2016/7/29 0029. */import android.app.Activity;import android.content.SharedPreferences;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;import android.text.TextUtils;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, Uri uri) { /* 第一次回調 不是我們想要的 直接返回 目前發現每次收到新短信都會走好幾次onChange(), 可以通過這個方法來使得onChange中的方法只走一次 */ if (uri.toString().equals("content://sms/raw")) { return; } /* 讀取收件箱中的短信 address 發件人手機號碼: body 信息內容: read 是否查看: date 發送時間: */ cursor = mActivity.getContentResolver().query(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "body", "read"}, null, null, "_id desc");//按降序排列// 指定號碼// mActivity.managedQuery(Uri.parse("content://sms/inbox"),// new String[]{"_id", "address", "body", "read"}, "address=? and read=?", new String[]{"10086", "0"}, "_id desc"); if (null != cursor && cursor.getCount() > 0) { cursor.moveToNext();//指向首位 int smsbodyColumn = cursor.getColumnIndex("body");//body位置 String smsBody = cursor.getString(smsbodyColumn);//獲取內容 String verifyCode = getDynamicPassword(smsBody); if (TextUtils.isEmpty(verifyCode)) { return; } if (mEditText == null) { throw new RuntimeException("你傳的EditText為空"); } if (verifyCode.contains("你從服務器上獲取到的驗證碼"))) { mEditText.setText(verifyCode); //EditText獲取焦點,3個屬性必須同時設置 mEditText.setFocusable(true); mEditText.setFocusableInTouchMode(true); mEditText.requestFocus(); mEditText.setSelection(verifyCode.length());//設置光標位置 } } if (!cursor.isClosed()) { cursor.close(); } } /** * 從字符串中截取連續4位數字 * 用于從短信中獲取動態密碼 * * @param str 短信內容 * @return 截取得到的4位動態密碼 */ public static 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或者fragment的onCreate方法中調用initSmSContentObserver()進行注冊,在onDestroy()中通過
//注銷內容監聽者
this.getContentResolver().unregisterContentObserver(readSmsContent);
取消注冊
/** * 初始化短信監聽數據庫 */ private void initSmSContentObserver() { readSmsContent = new ReadSmsContent(new Handler(), this, seCodeEditText); //注冊短信內容監聽 this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, readSmsContent); }上述兩種方式獲取到短信后,目前由于短信平臺來源賬號不固定,因此是通過驗證碼進行校驗。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答