編輯:關於Android編程
Android 自動獲取驗證碼的兩種方式分別是BroadcastReceiver及ContentObserver,兩種方式都需要進行注冊、取消注冊兩個步驟
記得添加權限,本文介紹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;
/**
* 讀取短信驗證碼,並設置驗證碼
* 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) {
/*
第一次回調 不是我們想要的 直接返回
目前發現每次收到新短信都會走好幾次onChange(),
可以通過這個方法來使得onChange中的方法只走一次
*/
if (uri.toString().equals("content://sms/raw")) {
return;
}
/*
讀取收件箱中的短信
address 發件人手機號碼:
body 信息內容:
read 是否查看:
date 發送時間:
*/
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);//獲取內容
String verifyCode = getDynamicPassword(smsBody);
if (TextUtils.isEmpty(verifyCode)) {
return;
}
if (mEditText == null) {
throw new RuntimeException("你傳的EditText為空");
}
if (verifyCode.contains("你從服務器上獲取到的驗證碼"))) {
mEditText.setText(verifyCode);
//EditText獲取焦點,3個屬性必須同時設置
mEditText.setFocusable(true);
mEditText.setFocusableInTouchMode(true);
mEditText.requestFocus();
mEditText.setSelection(verifyCode.length());//設置光標位置
}
}
if (!cursor.isClosed()) {
cursor.close();
}
}
/**
* 從字符串中截取連續4位數字
* 用於從短信中獲取動態密碼
*
* @param str 短信內容
* @return 截取得到的4位動態密碼
*/
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方法中調用initSmSContentObserver()進行注冊,在onDestroy()中通過
//注銷內容監聽者
this.getContentResolver().unregisterContentObserver(readSmsContent);
取消注冊
/**
* 初始化短信監聽數據庫
*/
private void initSmSContentObserver() {
readSmsContent = new ReadSmsContent(new Handler(), this, seCodeEditText);
//注冊短信內容監聽
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, readSmsContent);
}
上述兩種方式獲取到短信後,目前由於短信平台來源賬號不固定,因此是通過驗證碼進行校驗。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
Android安全開發之Provider組件安全
1 Content Provider組件簡介Content Provider組件是Android應用的重要組件之一,管理對數據的訪問,主要用於不同的應用程序之間實現數據共
Android自定義實現BaseAdapter的普通實現
對於ListVie來說,數據項的設置有很多種方式,而自定義實現BaseAdapter是最經常用的了,那麼這裡我們來講解一下自定義實現BaseAdapter的普通實現。Ma
java/android 設計模式學習筆記(17)---策略模式
這篇博客我們來介紹一下策略模式(Strategy Pattern,或者叫 Policy Pattern),也是行為型模式之一。通常在軟件開發中,我們為了一個功能可能會設計
Android系統實現DroidPlugin插件機制
360手機助手使用的 DroidPlugin,它是360手機助手團隊在Android系統上實現了一種插件機制。它可以在無需安裝、修改的情況下運行APK文件,此機制對改進大