Android采取ContentObserver方式自動(dòng)獲取驗(yàn)證碼
Android 自動(dòng)獲取驗(yàn)證碼的兩種方式分別是BroadcastReceiver及ContentObserver,兩種方式都需要進(jìn)行注冊、取消注冊兩個(gè)步驟
記得添加權(quán)限,本文介紹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; /** * 讀取短信驗(yàn)證碼,并設(shè)置驗(yàn)證碼 * 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) { /* 第一次回調(diào) 不是我們想要的 直接返回 目前發(fā)現(xiàn)每次收到新短信都會(huì)走好幾次onChange(), 可以通過這個(gè)方法來使得onChange中的方法只走一次 */ if (uri.toString().equals("content://sms/raw")) { return; } /* 讀取收件箱中的短信 address 發(fā)件人手機(jī)號碼: body 信息內(nèi)容: read 是否查看: date 發(fā)送時(shí)間: */ 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);//獲取內(nèi)容 String verifyCode = getDynamicPassword(smsBody); if (TextUtils.isEmpty(verifyCode)) { return; } if (mEditText == null) { throw new RuntimeException("你傳的EditText為空"); } if (verifyCode.contains("你從服務(wù)器上獲取到的驗(yàn)證碼"))) { mEditText.setText(verifyCode); //EditText獲取焦點(diǎn),3個(gè)屬性必須同時(shí)設(shè)置 mEditText.setFocusable(true); mEditText.setFocusableInTouchMode(true); mEditText.requestFocus(); mEditText.setSelection(verifyCode.length());//設(shè)置光標(biāo)位置 } } if (!cursor.isClosed()) { cursor.close(); } } /** * 從字符串中截取連續(xù)4位數(shù)字 * 用于從短信中獲取動(dòng)態(tài)密碼 * * @param str 短信內(nèi)容 * @return 截取得到的4位動(dòng)態(tài)密碼 */ 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方法中調(diào)用initSmSContentObserver()進(jìn)行注冊,在onDestroy()中通過
//注銷內(nèi)容監(jiān)聽者
this.getContentResolver().unregisterContentObserver(readSmsContent);
取消注冊
/** * 初始化短信監(jiān)聽數(shù)據(jù)庫 */ private void initSmSContentObserver() { readSmsContent = new ReadSmsContent(new Handler(), this, seCodeEditText); //注冊短信內(nèi)容監(jiān)聽 this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, readSmsContent); }
上述兩種方式獲取到短信后,目前由于短信平臺(tái)來源賬號不固定,因此是通過驗(yàn)證碼進(jìn)行校驗(yàn)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 中SwipeRefreshLayout與ViewPager滑動(dòng)事件沖突解決方法
這篇文章主要介紹了Android 中SwipeRefreshLayout與ViewPager滑動(dòng)事件沖突解決方法的相關(guān)資料,需要的朋友可以參考下2017-04-04Android使用RSA加密實(shí)現(xiàn)接口調(diào)用時(shí)的校驗(yàn)功能
這篇文章主要介紹了Android+Java使用RSA加密實(shí)現(xiàn)接口調(diào)用時(shí)的校驗(yàn)功能,幫助大家更好的利用Android進(jìn)行開發(fā),感興趣的朋友可以了解下2020-12-12Android Flutter利用CustomPaint繪制基本圖形詳解
CustomPaint其實(shí)和前端的Canvas基本上是一樣的,前端Canvas支持的繪制方法CustomPaint都支持,畢竟CustomPaint其實(shí)也是基于Canvas實(shí)現(xiàn)的。本篇我們來介紹 CustomPaint 基本圖形的繪制,感興趣的可以了解一下2022-07-07Android React Native原生模塊與JS模塊通信的方法總結(jié)
這篇文章主要介紹了Android React Native原生模塊與JS模塊通信的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-02-02詳解Flutter桌面應(yīng)用如何進(jìn)行多分辨率適配
這篇文章主要為大家介紹了Flutter桌面應(yīng)用如何進(jìn)行多分辨率適配的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Android 彈出Dialog時(shí)隱藏狀態(tài)欄和底部導(dǎo)航欄的方法
這篇文章主要介紹了Android 彈出Dialog時(shí)隱藏狀態(tài)欄和底部導(dǎo)航欄的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Android開發(fā)使用Message對象分發(fā)必備知識(shí)點(diǎn)詳解
這篇文章主要為大家介紹了Android開發(fā)使用Message對象分發(fā)必備知識(shí)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Android編程之ICS式下拉菜單PopupWindow實(shí)現(xiàn)方法詳解(附源碼下載)
這篇文章主要介紹了Android編程之ICS式下拉菜單PopupWindow實(shí)現(xiàn)方法,結(jié)合實(shí)例詳細(xì)分析了ICS式下拉菜單的實(shí)現(xiàn)原理與相關(guān)技巧,并附帶源碼供讀者下載,需要的朋友可以參考下2015-12-12深入解析Android中的setContentView加載布局原理
在日常開發(fā)Android中setContentView是必不可少的一部分,下面這篇文章主要給大家介紹了關(guān)于Android中setContentView的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09Android?中TextureView和SurfaceView的屬性方法及示例說明
這篇文章主要介紹了Android?中TextureView和SurfaceView的屬性方法及示例說明,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06