读取短信验证码并自动设置给文本框

最近项目中用到自动读取短信验证码这一功能,本人自己封装了一个工具类,可以直接拿来用,源码如下:


import android.app.Activity;
import android.content.ContentValues;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
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) {
        super.onChange(selfChange);
        Log.e("tag", "onChange");
        // 读取收件箱中指定号码的短信
        cursor = mActivity.managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "body", "read"}, null, null, "_id desc");

        if (cursor != null && cursor.getCount() > 0) {
            ContentValues values = new ContentValues();
            values.put("read", "1");        //修改短信为已读模式
            cursor.moveToNext();
            int smsbodyColumn = cursor.getColumnIndex("body");
            String smsBody = cursor.getString(smsbodyColumn);
            Log.e("399", "smsBody :" + smsBody);
            String verifyCode = getDynamicPassword(smsBody);
            if(TextUtils.isEmpty(verifyCode)){
                return;
            }
            if(mEditText == null) {
                throw new RuntimeException("你传的EditText为空");
            }
                mEditText.setText(verifyCode);
                //EditText获取焦点,3个属性必须同时设置
                  mEditText.setFocusable(true);
                mEditText.setFocusableInTouchMode(true);
                mEditText.requestFocus();
                mEditText.setSelection(verifyCode.length());//设置光标位置
        }
        //在用managedQuery的时候,不能主动调用close()方法, 否则在Android 4.0+的系统上,         会发生崩溃
        if (Build.VERSION.SDK_INT < 14) {
            cursor.close();
        }
    }

        /**
         * 从字符串中截取连续4位数字
         * 用于从短信中获取动态密码
         *
         * @param str 短信内容
         * @return 截取得到的4位动态密码
         */
    public 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的onCreate方法中注册

readSmsContent = new ReadSmsContent(new Handler(),this,mVerifyCodeEditText);
//注册短信内容监听
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, readSmsContent);


在Activity的onDestroy中注销监听

//注销内容监听者
this.getContentResolver().unregisterContentObserver(readSmsContent);



需要的权限:

   <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />


  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 36
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值