Android采取ContentObserver方式自動獲取驗(yàn)證碼
Android 自動獲取驗(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)每次收到新短信都會走好幾次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ù)字
* 用于從短信中獲取動態(tài)密碼
*
* @param str 短信內(nèi)容
* @return 截取得到的4位動態(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);
}
上述兩種方式獲取到短信后,目前由于短信平臺來源賬號不固定,因此是通過驗(yàn)證碼進(jìn)行校驗(yàn)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)底部彈出按鈕菜單升級版
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部彈出按鈕菜單的升級版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android TableLayout數(shù)據(jù)列表的回顯清空實(shí)現(xiàn)思路及代碼
數(shù)據(jù)列表的回顯必須從后面減去子元素同時(shí)必須從后面減去子元素,感興趣的朋友可以看下具體的實(shí)現(xiàn)代碼,希望對你學(xué)習(xí)Android TableLayout有所幫助2013-04-04
基于Android studio3.6的JNI教程之helloworld思路詳解
這篇文章主要介紹了基于Android studio3.6的JNI教程之helloworld,本文通過圖文實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android自定義Spinner下拉列表(使用ArrayAdapter和自定義Adapter實(shí)現(xiàn))
這篇文章主要介紹了Android自定義Spinner下拉列表(使用ArrayAdapter和自定義Adapter實(shí)現(xiàn))的相關(guān)資料,需要的朋友可以參考下2015-10-10
andriod開發(fā)之Activity的渲染機(jī)制
本文給大家分享的是在andriod開發(fā)中經(jīng)常需要用到的Activity的渲染機(jī)制的詳細(xì)說明,主要是通過實(shí)例給大家講解Activity是如何畫到屏幕上的,希望大家能夠喜歡2018-03-03
Android pdf viewer在android studio應(yīng)用問題說明詳解
這篇文章主要介紹了Android pdf viewer在android studio應(yīng)用問題說明的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
Android實(shí)現(xiàn)懸浮窗全系統(tǒng)版本
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)懸浮窗全系統(tǒng)版本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11

