Android利用CursorLoader實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫
概述
Android上實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫,常用的有兩種方式。一種是利用BroadCastReceiver,還有一種是監(jiān)聽手機(jī)上短信數(shù)據(jù)庫的變化。利用BroadCastReceiver來實(shí)現(xiàn)會(huì)在一些情況下無效,最常見的就是手機(jī)上安裝了具有垃圾短信攔截功能的軟件的情況下,短信驗(yàn)證碼自動(dòng)填寫無效。所以,現(xiàn)在一般會(huì)選用監(jiān)聽數(shù)據(jù)庫內(nèi)容變化的方式來實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫。
網(wǎng)上對(duì)于利用監(jiān)聽數(shù)據(jù)庫內(nèi)容變化來實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫的文章也很多,主要分為一下步驟:
1. 繼承ContentObserver實(shí)現(xiàn)一個(gè)短信數(shù)據(jù)庫的觀察者,再onChange。
2. 在Activity中注冊(cè)設(shè)個(gè)觀察者。
3. 在AndroidManifast文件中添加相關(guān)權(quán)限。
4. 別忘了再Activity的onDestory方法中取消注冊(cè)的觀察者。
經(jīng)過驗(yàn)證這種方式是可行的,而且比較好用。這種方法讀取短信的Cursor來源與Activity的managedQuery方法,這個(gè)方法已經(jīng)被標(biāo)記為廢棄,推薦用CursorLoader來代替。
CursorLoader的好處
首先,CursorLoader繼承的是AsyncTaskLoader,采用異步的方式查詢數(shù)據(jù)庫,避免了同步查詢阻塞UI線程的問題。它自己會(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)填寫的實(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)聽
* @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;
}
}
使用方法
使用比較簡單,直接再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());
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)自動(dòng)填充短信驗(yàn)證碼
- Android開發(fā)工程中集成mob短信驗(yàn)證碼功能的方法
- Android獲取和讀取短信驗(yàn)證碼的實(shí)現(xiàn)方法
- Android實(shí)現(xiàn)短信驗(yàn)證碼獲取自動(dòng)填寫功能(詳細(xì)版)
- Android開發(fā)中通過手機(jī)號(hào)+短信驗(yàn)證碼登錄的實(shí)例代碼
- Android實(shí)現(xiàn)獲取短信驗(yàn)證碼并自動(dòng)填寫功能
- Android 短信驗(yàn)證碼自動(dòng)填寫
- Android實(shí)現(xiàn)短信驗(yàn)證碼自動(dòng)填寫
- Android實(shí)現(xiàn)自動(dòng)填寫獲取驗(yàn)證碼功能
- Android短信驗(yàn)證碼自動(dòng)填寫實(shí)現(xiàn)代碼
相關(guān)文章
Android源碼使用16進(jìn)制進(jìn)行狀態(tài)管理的方法
這篇文章主要介紹了Android源碼使用16進(jìn)制進(jìn)行狀態(tài)管理的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
Android串口開發(fā)之使用JNI實(shí)現(xiàn)ANDROID和串口通信詳解
這篇文章主要給大家介紹了關(guān)于Android串口開發(fā)之使用JNI實(shí)現(xiàn)ANDROID和串口通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
Android SharedPreferences實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)功能
這篇文章主要為大家詳細(xì)介紹了Android SharedPreferences實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
在android中實(shí)現(xiàn)類似uc和墨跡天氣的左右拖動(dòng)效果
本文主要介紹下怎樣在android實(shí)現(xiàn)uc和墨跡天氣那樣的左右拖動(dòng)效果,具體代碼如下,感興趣的朋友可以參考下哈2013-06-06
Android之scrollview滑動(dòng)使標(biāo)題欄漸變背景色的實(shí)例代碼
這篇文章主要介紹了Android之scrollview滑動(dòng)使標(biāo)題欄漸變背景色的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05

