Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android利用CursorLoader實現短信驗證碼自動填寫

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

編輯:關於Android編程

概述

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); //驗證碼填充
      }
    }, "\\d{4}").registerTo(1,getSupportLoaderManager());

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved