国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android利用CursorLoader實現短信驗證碼自動填寫

2019-12-12 04:44:38
字體:
來源:轉載
供稿:網友

概述

Android上實現短信驗證碼自動填寫,常用的有兩種方式。一種是利用BroadCastReceiver,還有一種是監聽手機上短信數據庫的變化。利用BroadCastReceiver來實現會在一些情況下無效,最常見的就是手機上安裝了具有垃圾短信攔截功能的軟件的情況下,短信驗證碼自動填寫無效。所以,現在一般會選用監聽數據庫內容變化的方式來實現短信驗證碼自動填寫。
網上對于利用監聽數據庫內容變化來實現短信驗證碼自動填寫的文章也很多,主要分為一下步驟:
1. 繼承ContentObserver實現一個短信數據庫的觀察者,再onChange。
2. 在Activity中注冊設個觀察者。
3. 在AndroidManifast文件中添加相關權限。
4. 別忘了再Activity的onDestory方法中取消注冊的觀察者。
經過驗證這種方式是可行的,而且比較好用。這種方法讀取短信的Cursor來源與Activity的managedQuery方法,這個方法已經被標記為廢棄,推薦用CursorLoader來代替。

CursorLoader的好處

首先,CursorLoader繼承的是AsyncTaskLoader,采用異步的方式查詢數據庫,避免了同步查詢阻塞UI線程的問題。它自己會監視數據源的變化并且會主動上報。而且,當發生配置上的變化,重新生成的loader會自動連接到變化前的cursor,在不使用查詢到的資源時,可以自動將其釋放。

短信驗證碼自動填寫的實現類

一言不合就直接貼代碼了:

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 : 驗證碼自動填充</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 新短信監聽   * @param msgRegular 對新短信處理的正則表達式,如果為空,則不進行處理   */  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排序的話,修改手機時間后,讀取的短信就不準了    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中加上:

//匹配四位數字的短信驗證碼new VerificationCodeAutoFill(this, new VerificationCodeAutoFill.OnNewMessageListener() {      @Override      public void onNewMessage(String msg) {        //etMsg.setText(msg); //驗證碼填充      }    }, "http://d{4}").registerTo(1,getSupportLoaderManager());

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 北流市| 巧家县| 潜山县| 阿荣旗| 牟定县| 灵宝市| 和龙市| 浦城县| 周至县| 都江堰市| 科技| 视频| 怀柔区| 惠东县| 玉门市| 保定市| 比如县| 桂阳县| 专栏| 信阳市| 富阳市| 栾城县| 曲阜市| 霍林郭勒市| 德阳市| 浦县| 华坪县| 新龙县| 淳化县| 沂水县| 麻城市| 石棉县| 昂仁县| 安陆市| 六安市| 高邑县| 海城市| 安乡县| 碌曲县| 阜平县| 宁城县|