Android采取ContentObserver方式自動(dòng)獲取驗(yàn)證碼
Android 自動(dòng)獲取驗(yàn)證碼的兩種方式分別是BroadcastReceiver及ContentObserver,兩種方式都需要進(jìn)行注冊(cè)、取消注冊(cè)兩個(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(),
可以通過(guò)這個(gè)方法來(lái)使得onChange中的方法只走一次
*/
if (uri.toString().equals("content://sms/raw")) {
return;
}
/*
讀取收件箱中的短信
address 發(fā)件人手機(jī)號(hào)碼:
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");//按降序排列
// 指定號(hào)碼
// 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)行注冊(cè),在onDestroy()中通過(guò)
//注銷內(nèi)容監(jiān)聽(tīng)者
this.getContentResolver().unregisterContentObserver(readSmsContent);
取消注冊(cè)
/**
* 初始化短信監(jiān)聽(tīng)數(shù)據(jù)庫(kù)
*/
private void initSmSContentObserver() {
readSmsContent = new ReadSmsContent(new Handler(), this, seCodeEditText);
//注冊(cè)短信內(nèi)容監(jiān)聽(tīng)
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, readSmsContent);
}
上述兩種方式獲取到短信后,目前由于短信平臺(tái)來(lái)源賬號(hào)不固定,因此是通過(guò)驗(yàn)證碼進(jìn)行校驗(yàn)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)底部彈出按鈕菜單升級(jí)版
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部彈出按鈕菜單的升級(jí)版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android TableLayout數(shù)據(jù)列表的回顯清空實(shí)現(xiàn)思路及代碼
數(shù)據(jù)列表的回顯必須從后面減去子元素同時(shí)必須從后面減去子元素,感興趣的朋友可以看下具體的實(shí)現(xiàn)代碼,希望對(duì)你學(xué)習(xí)Android TableLayout有所幫助2013-04-04
基于Android studio3.6的JNI教程之helloworld思路詳解
這篇文章主要介紹了基于Android studio3.6的JNI教程之helloworld,本文通過(guò)圖文實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android實(shí)現(xiàn)通話自動(dòng)錄音
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)通話自動(dòng)錄音,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
Android自定義Spinner下拉列表(使用ArrayAdapter和自定義Adapter實(shí)現(xiàn))
這篇文章主要介紹了Android自定義Spinner下拉列表(使用ArrayAdapter和自定義Adapter實(shí)現(xiàn))的相關(guān)資料,需要的朋友可以參考下2015-10-10
andriod開(kāi)發(fā)之Activity的渲染機(jī)制
本文給大家分享的是在andriod開(kāi)發(fā)中經(jīng)常需要用到的Activity的渲染機(jī)制的詳細(xì)說(shuō)明,主要是通過(guò)實(shí)例給大家講解Activity是如何畫(huà)到屏幕上的,希望大家能夠喜歡2018-03-03
Android pdf viewer在android studio應(yīng)用問(wèn)題說(shuō)明詳解
這篇文章主要介紹了Android pdf viewer在android studio應(yīng)用問(wèn)題說(shuō)明的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
Android屬性動(dòng)畫(huà)特點(diǎn)詳解
這篇文章主要為大家詳細(xì)介紹了Android屬性動(dòng)畫(huà)特點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Android實(shí)現(xiàn)懸浮窗全系統(tǒng)版本
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)懸浮窗全系統(tǒng)版本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11

