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); }

上述两种方式获取到短信后,目前由于短信平台来源账号不固定,因此是通过验证码进行校验。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
  2. Android短信操作(通过内容提供者)
  3. Android短信相关的常见协议
  4. android中如何查看内存
  5. android 用BroadcastReceiver监听网络~
  6. android完全退出程序的几种方式
  7. Android(安卓)MMS 数据存取数据表
  8. Service永不kill掉
  9. 【Android(安卓)开发教程】如何选择最佳的存储方式

随机推荐

  1. Android剪切图片
  2. Android(安卓)Interface Definition Lang
  3. Android Studio 中编译JDK 版本配置
  4. phonegap与openlayers混搭在android上显
  5. 搭建IPC通信框架(RPC)
  6. 提供一些Android免费课程分享给大家
  7. 修改系统action bar字体大小、粗细、颜色
  8. 强制保持Android(安卓)Activity状态
  9. Android下载文本文件和mp3文件
  10. VectorDrawable