Android自动填充短信验证码功能(demo)

项目需求:

Android开发中用户登录往会用到短信验证的功能,如果让用户先查看短信,然后再回到界面填写验证码,用户体验不是很好,有时就需要实现验证码的自动填写功能。

做法:

我以前的做法是先创建一个广播接收器,接受短信变化的广播,收到广播时,再把验证码提取出来。

那时有用户测试反馈他的手机安装了其他一些短信应用或者手机本身限制了权限的情况下,这种方式可能起不了作用,即使把优先级设高,也不能保证不会被别的应用抢先。

以前用户卸载掉第三方软件后,就没再追究了。

现在发现可以通过监听短信数据库的方式实现。监听短信数据库主要是通过ContentObserver这个类来完成。ContentObserver主要是通过Uri来监测特定的Databases的表,当ContentObserver所观察的Uri发生变化时,便会触发它。ContentObserver内容观察者,可监听观察特定Uri指向的数据库项的变化,进而进行相应的处理。

public class MessageContentObserver extends ContentObserver {
  private Context mContext;
  private Handler mHandler;
  private String code;
  public MessageContentObserver(Context context, Handler handler) {
    super(handler);
    mContext = context;
    mHandler = handler;
  }
  /**
   * 回调函数, 当监听的Uri发生改变时,会回调该方法
   * 需要注意的是当收到短信的时候会回调两次
   * 收到短信一般来说都是执行了两次onchange方法.第一次一般都是raw的这个.
   * 虽然收到了短信.但是短信并没有写入到收件箱里
   */
  @Override
  public void onChange(boolean selfChange, Uri uri) {
    if (uri.toString().equals("content://sms/raw")) {
     return;
    }
   Uri inboxUri = Uri.parse("content://sms/inbox");
   Cursor c = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc"); // 按时间顺序排序短信数据库
    if (c != null) {
       if (c.moveToFirst()) {
         String address = c.getString(c.getColumnIndex("address"));//发送方号码
         String body = c.getString(c.getColumnIndex("body")); // 短信内容
        if (!address.equals("10086")) {
            return;
        }
        Pattern pattern = Pattern.compile("(\\d{6})");//正则表达式匹配验证码
        Matcher matcher = pattern.matcher(body);        if (matcher.find()) {
          code = matcher.group(0);
          Message msg = Message.obtain();
          msg.what = MainActivity.MSG_RECEIVE_CODE;
          msg.obj = code;
          mHandler.sendMessage(msg);
        }
      }
      c.close();
    }
  }
}

调用:

/**
 * 短信验证码自动填写功能的实现
 */
public class MainActivity extends Activity {
  public static final int MSG_RECEIVE_CODE = 1; //收到短信的验证码
  private EditText codeEdt; //短信验证码的输入框
  private MessageContentObserver messageContentObserver;  //回调接口
  @SuppressLint("HandlerLeak")
  Handler handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   if (msg.what == MSG_RECEIVE_CODE) {
       //设置读取到的内容
      }
    }
  };
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    codeEdt = (EditText) findViewById(R.id.smsCode);
    findViewById(R.id.send_sms_btn).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        senSMSCode();
      }
    });
    messageContentObserver = new MessageContentObserver(MainActivity.this, handler);
 getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, messageContentObserver);
  }
   /**
   * 取消注册
   */
  @Override
  protected void onDestroy() {
    super.onDestroy();
 getContentResolver().unregisterContentObserver(messageContentObserver);
  }
  private void senSMSCode() {
  }
}

需要在AndroidManifest.xml加上权限

<!--读取短信的权限-->
  <uses-permission android:name="android.permission.RECEIVE_SMS"/>
  <uses-permission android:name="android.permission.READ_SMS" />

关于content://sms/inbox表,大致包含的域有:

_id | 短消息序号 如100 thread_id | 对话的序号 如100
address | 发件人地址,手机号.如+8613811810000 person | 发件人,返回一个数字就是联系人列表里的序号,陌生人为null
date | 日期 long型。如1256539465022 protocol | 协议 0 SMS_RPOTO, 1 MMS_PROTO
read | 是否阅读 0未读, 1已读
status | 状态 -1接收,0 complete, 64 pending, 128 failed
type | 类型 1是接收到的,2是已发出
body | 短消息内容
service_center | 短信服务中心号码编号。
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱 (正在发送的信息)
content://sms/failed 发送失败
content://sms/queued 待发送列表

项目地址

https://github.com/88ios/SMSContentObserver-master

项目主要用第三方bomb来发短信,感兴趣不妨看看。

以上所述是小编给大家介绍的Android自动填充短信验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

时间: 2017-02-01

Android短信验证码(用的Mob短信验证)

Android短信验证码功能,供大家参考,具体内容如下 1.参考资料 Mob网站:http://www.mob.com/ Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android 教程:Mob短信验证的具体使用 教程的源代码:  http://git.oschina.net/lizhanqi/MobSMSDemo Dialog教程:Android Dialog对话框 定时器教程:Android 实现定时器的四种方式 2.前期准备 (

Android利用CursorLoader实现短信验证码自动填写

概述 Android上实现短信验证码自动填写,常用的有两种方式.一种是利用BroadCastReceiver,还有一种是监听手机上短信数据库的变化.利用BroadCastReceiver来实现会在一些情况下无效,最常见的就是手机上安装了具有垃圾短信拦截功能的软件的情况下,短信验证码自动填写无效.所以,现在一般会选用监听数据库内容变化的方式来实现短信验证码自动填写. 网上对于利用监听数据库内容变化来实现短信验证码自动填写的文章也很多,主要分为一下步骤: 1. 继承ContentObserver实现

Android获取短信验证码的实现方法

先给大家展示下效果图,如果感觉不错,请参考实现思路详解 Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性.无论是用户注册时的信息验证还是当用户发出找回密码请求时的短信验证,他们的工作原理大致上是一致的,因为项目的需要研究了一下关于这方面的知识,本篇我将带领大家一起实现这一当下流行的设计方案. 众所周知,短信验证需要服务器端生成一个验证码,然后发送到用户输入的手机上,这个过程需要服务器主

Android使用第三方服务器Bmob实现发送短信验证码

调用Bmob第三方服务器实现短信验证的功能,大致思路如下: 随机产生6位数字,然后调用Bmob的请求短发函数发送者六位数到服务器,然后服务器给指定手机发送这6位验证码,然后感觉用户输入的数字进行判断,如果输入的和发送的相等,则验证成功. 第一步.请求验证码: SimpleDateFormat format =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String sendTime = format.format(new Date());

Android 短信验证码自动填写

Android 短信验证码自动填写 1.自定义Observer监听短信数据库变化(注意添加短信权限) import android.app.Activity; import android.content.ContentResolver; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import

Android中用Bmob实现短信验证码功能的方法详解

这篇文章主要介绍发送验证码和校验验证码的功能,用到一个第三方平台Bmob,那Bmob是什么呢?Bmob可以开发一个云存储的移动应用软件,他提供了大量的标准的API接口,根据需要接入相关服务,开发者可以更加专注于应用的开发,让产品交付更快速,验证码功能就是其中一个. 一.跟其他第三方一样,我们开发之前要做一些准备工作. 1.首先,去官网注册一个帐号:http://www.bmob.cn/: 2.然后就可以创建应用了:具体怎么做Bmob说得很清楚了(官方操作介绍),如果你不想看,我简单说一下:点击右

Android如何集成极光短信验证

先借助Android studio工具新建一个新的空项目. 步骤一(获取appkey) 1.在极光官网平台上新建短信应用(根据要求包名和应用名称填写好) 2.获取得到Jpush_AppKey 步骤二 (导入第三方库和so文件) 1.用Android studio打开应用 2.切换应用状态Android为Project状态 3.在libs文件夹下把对应的jar文件拷入  然后as libraries 步骤三(初始化以及调用) 1.新建Application初始化 public class MyAp

Android实现发送短信验证码倒计时功能示例

一.简介: 开发中在用户注册或找回密码之类的功能,经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的. 效果图: 二.实现步骤: 1.一个关键类:CountDownTimer(Android系统自带的倒计时功能类) public class CountDownTimerUtils extends CountDownTimer { private TextView mTextView; //显示倒计时的文字 /** * @param textView Th

JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)

1.功能描述 当用户想要获取验证码时,就点击 免费获取验证码 ,然后开始倒计时,倒计时期间按钮文字为剩余时间x秒,且不可按状态,倒计时结束后,按钮更改为点击重新发送. 2.分析 必须用到定时器.按钮点击后,在定时器内做出判断.倒计时60秒,到0结束. 3.代码实现: 重点介绍:定时器在进行下一次倒计时之前,一定要清除一下,这样的话保证下一次定时器倒计时是正常的. <!DOCTYPE html> <html> <head> <meta charset="U

swift 3.0 实现短信验证码倒计时功能

下面一段代码给大家分享swift 3.0 实现短信验证码倒计时功能,具体实例代码如下所示: class TCCountDown { private var countdownTimer: Timer? var codeBtn = UIButton() private var remainingSeconds: Int = 0 { willSet { codeBtn.setTitle("重新获取\(newValue)秒", for: .normal) if newValue <=

vue 实现通过手机发送短信验证码注册功能

效果如下: 代码如下: template代码: <el-main> <el-form :model="ReginForm" ref="ReginForm" :rules="rule" class="regform" label-width="0"> <h3 class="login-text">手机注册</h3> <el-form-i

Android 用RxBinding与RxJava2实现短信验证码倒计时功能

场景:注册账号页面时,我们点击按钮发送验证码,在等待验证码时,界面会有倒计时提示,这此期间按钮不可点击.当倒计时结束时,按钮恢复. 实现与功能都不难,这次用 RxBinding,RxJava2 的方法去实现.并实现了手动.自动停止倒计时,防止多次点击. 功能动态图 要使用 RxBinding.RxJava2 先添加 Gradle 配置: compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxj

Java实现发送短信验证码功能

一个发送短信验证码的功能,使用的是信易通的短信平台接口,然后在Java中使用HttpClient模拟POST请求或者GET请求(看短信平台要求,一般的情况下都是POST请求),调用短信平台提供的接口(遵循短信平台的接口规范即可).具体看代码: 使用HttpClient的时候需要在项目中引入: commons-httpclient-3.1.jar 这个jar包, 项目结构: 1.创建一个Http的模拟请求工具类,然后写一个POST方法或者GET方法 /** * 文件说明 * @Descriptio

Android 调用发送短信的方法

Android 调用发送短信的方法 功能:调用发送短信功能 1 . 权限 <uses-permission android:name="android.permission.SEND_SMS"/> 2.具体实现 Uri smstoUri = Uri.parse("smsto:"); Intent intent = new Intent(Intent.ACTION_VIEW,smstoUri); intent.putExtra("address&

基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)

相关阅读: 基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭) 下面一段代码是小编给大家带来的js发送短信验证码后实现倒计时功能,代码简单易懂. 具体代码如下所示: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus

基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)

相关阅读: 基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能) 今天测试提了一个bug,发送短信倒计时功能,要求关闭页面也要进行倒计时.这想到了,当年我参与的周杰伦演唱会的先付先抢功能.与之类似,只不过,那个项目的时间都是服务器时间,本人目前有点偷懒,就用客户端的时间了. 一下是完整的代码,只不过在客户端的效率不是很好. <!doctype html> <html lang="en"> <head> <meta

jQuery实现倒计时重新发送短信验证码功能示例

本文实例讲述了jQuery实现倒计时重新发送短信验证码功能的方法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html> <head> <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <script type="text/javascript"> var countdown