Android利用CursorLoader實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫(xiě)
概述
Android上實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫(xiě),常用的有兩種方式。一種是利用BroadCastReceiver,還有一種是監(jiān)聽(tīng)手機(jī)上短信數(shù)據(jù)庫(kù)的變化。利用BroadCastReceiver來(lái)實(shí)現(xiàn)會(huì)在一些情況下無(wú)效,最常見(jiàn)的就是手機(jī)上安裝了具有垃圾短信攔截功能的軟件的情況下,短信驗(yàn)證碼自動(dòng)填寫(xiě)無(wú)效。所以,現(xiàn)在一般會(huì)選用監(jiān)聽(tīng)數(shù)據(jù)庫(kù)內(nèi)容變化的方式來(lái)實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫(xiě)。
網(wǎng)上對(duì)于利用監(jiān)聽(tīng)數(shù)據(jù)庫(kù)內(nèi)容變化來(lái)實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫(xiě)的文章也很多,主要分為一下步驟:
1. 繼承ContentObserver實(shí)現(xiàn)一個(gè)短信數(shù)據(jù)庫(kù)的觀察者,再onChange。
2. 在Activity中注冊(cè)設(shè)個(gè)觀察者。
3. 在AndroidManifast文件中添加相關(guān)權(quán)限。
4. 別忘了再Activity的onDestory方法中取消注冊(cè)的觀察者。
經(jīng)過(guò)驗(yàn)證這種方式是可行的,而且比較好用。這種方法讀取短信的Cursor來(lái)源與Activity的managedQuery方法,這個(gè)方法已經(jīng)被標(biāo)記為廢棄,推薦用CursorLoader來(lái)代替。
CursorLoader的好處
首先,CursorLoader繼承的是AsyncTaskLoader,采用異步的方式查詢數(shù)據(jù)庫(kù),避免了同步查詢阻塞UI線程的問(wèn)題。它自己會(huì)監(jiān)視數(shù)據(jù)源的變化并且會(huì)主動(dòng)上報(bào)。而且,當(dāng)發(fā)生配置上的變化,重新生成的loader會(huì)自動(dòng)連接到變化前的cursor,在不使用查詢到的資源時(shí),可以自動(dòng)將其釋放。
短信驗(yàn)證碼自動(dòng)填寫(xiě)的實(shí)現(xiàn)類
一言不合就直接貼代碼了:
package com.wuwang.demo; import android.content.ContentValues; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.util.Log; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * <p>Author : Wuwang </p> * <p>Company : ZhiJiaKeJi</p> * <p>Date :2016-07-21 09:16</p> * <p>Description : 驗(yàn)證碼自動(dòng)填充</p> */ public class VerificationCodeAutoFill implements LoaderManager.LoaderCallbacks<Cursor> { private Context context; private OnNewMessageListener listener; private String msgRegular; public VerificationCodeAutoFill(Context context){ this(context,null,null); } public VerificationCodeAutoFill(Context context,OnNewMessageListener listener){ this(context,listener,null); } /** * @param context * @param listener 新短信監(jiān)聽(tīng) * @param msgRegular 對(duì)新短信處理的正則表達(dá)式,如果為空,則不進(jìn)行處理 */ public VerificationCodeAutoFill(Context context, OnNewMessageListener listener,String msgRegular){ this.context=context; this.listener=listener; this.msgRegular=msgRegular; } public VerificationCodeAutoFill registerTo(int id,LoaderManager manager){ manager.initLoader(id,null,this); return this; } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(context,Uri.parse("content://sms/inbox"), new String[] { "_id", "address", "read", "body" }, " read=?", new String[] {"0" }, "_id desc"); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // 按id排序,如果按date排序的話,修改手機(jī)時(shí)間后,讀取的短信就不準(zhǔn)了 if (data != null && data.getCount() > 0) { ContentValues values = new ContentValues(); values.put("read", "1"); // 修改短信為已讀模式 data.moveToNext(); int smsbodyColumn = data.getColumnIndex("body"); String smsBody = data.getString(smsbodyColumn); Log.e("wuwang",smsBody); if(listener!=null){ listener.onNewMessage(getDynamicPassword(smsBody,msgRegular)); } } } @Override public void onLoaderReset(Loader<Cursor> loader) { } public interface OnNewMessageListener { void onNewMessage(String msg); } private String getDynamicPassword(String str,String regular) { if(regular==null)return str; Pattern continuousNumberPattern = Pattern.compile(msgRegular); Matcher m = continuousNumberPattern.matcher(str); String dynamicPassword = ""; while (m.find()) { System.out.print(m.group()); dynamicPassword = m.group(); } return dynamicPassword; } }
使用方法
使用比較簡(jiǎn)單,直接再FragmengActivity中加上:
//匹配四位數(shù)字的短信驗(yàn)證碼 new VerificationCodeAutoFill(this, new VerificationCodeAutoFill.OnNewMessageListener() { @Override public void onNewMessage(String msg) { //etMsg.setText(msg); //驗(yàn)證碼填充 } }, "\\d{4}").registerTo(1,getSupportLoaderManager());
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)自動(dòng)填充短信驗(yàn)證碼
- Android開(kāi)發(fā)工程中集成mob短信驗(yàn)證碼功能的方法
- Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法
- Android實(shí)現(xiàn)短信驗(yàn)證碼獲取自動(dòng)填寫(xiě)功能(詳細(xì)版)
- Android開(kāi)發(fā)中通過(guò)手機(jī)號(hào)+短信驗(yàn)證碼登錄的實(shí)例代碼
- Android實(shí)現(xiàn)獲取短信驗(yàn)證碼并自動(dòng)填寫(xiě)功能
- Android 短信驗(yàn)證碼自動(dòng)填寫(xiě)
- Android實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫(xiě)
- Android實(shí)現(xiàn)自動(dòng)填寫(xiě)獲取驗(yàn)證碼功能
- Android短信驗(yàn)證碼自動(dòng)填寫(xiě)實(shí)現(xiàn)代碼
相關(guān)文章
Android自定義View實(shí)現(xiàn)顏色選取器
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)顏色選取器 ,類似SeekBar的方式通過(guò)滑動(dòng)選擇顏色,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android獲取arrays.xml里的數(shù)組字段值實(shí)例詳解
這篇文章主要介紹了Android獲取arrays.xml里的數(shù)組字段值實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Android實(shí)現(xiàn)關(guān)機(jī)后數(shù)據(jù)不會(huì)丟失問(wèn)題
這篇文章主要介紹了Android實(shí)現(xiàn)關(guān)機(jī)后數(shù)據(jù)不會(huì)丟失問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Android實(shí)現(xiàn)簡(jiǎn)易的鬧鐘功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)易的鬧鐘功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android實(shí)現(xiàn)整理PackageManager獲取所有安裝程序信息
這篇文章主要介紹了Android實(shí)現(xiàn)整理PackageManager獲取所有安裝程序信息的方法,實(shí)例分析了Android使用PackageManager獲取安裝程序信息的具體步驟與相關(guān)技巧,需要的朋友可以參考下2016-01-01Flutter中嵌入Android 原生TextView實(shí)例教程
這篇文章主要給大家介紹了關(guān)于Flutter中嵌入Android 原生TextView的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Anroid四大組件service之本地服務(wù)的示例代碼
本篇文章主要介紹了Anroid四大組件service之本地服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Android camera實(shí)時(shí)預(yù)覽 實(shí)時(shí)處理,人臉識(shí)別示例
本篇文章主要介紹了Android camera實(shí)時(shí)預(yù)覽 實(shí)時(shí)處理,面部認(rèn)證示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01Android 實(shí)現(xiàn)掃雷小游戲?qū)嵗a
這篇文章主要介紹了Android 實(shí)現(xiàn)掃雷小游戲?qū)嵗a的相關(guān)資料,需要的朋友可以參考下2016-12-12