欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android采取ContentObserver方式自動(dòng)獲取驗(yàn)證碼

 更新時(shí)間:2016年08月03日 10:19:47   作者:feiyangbahu1  
這篇文章主要為大家詳細(xì)介紹了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)文章

最新評論