Android 自动填充短信验证码

来源:互联网 发布:超次元矩阵狂三 编辑:程序博客网 时间:2024/05/29 18:44

目前在很多应用中,都有自动获取验证码的功能:点击获取验证码按钮,收到短信,当前应用不需要退出程序就可以获取到短信中的验证码,并可以做到自动填充,无须用户在短信和App之间来回切换。

重新定义ContentObserver

用来监听短信,一旦有新消息过来,就去判断是否有我想要的那个号码发过来的短信,如果是,就直接用正则表达式截取验证码,代码如下:

public class SMSContentObserver extends ContentObserver {    private Context mContext; // 上下文    private Handler mHandler; // 更新UI线程    public SMSContentObserver(Context context, Handler handler) {        super(handler);        mContext = context;        mHandler = handler;    }    /**     * 回调函数, 当所监听的Uri发生改变时,就会回调此方法     * 注意当收到短信的时候会回调两次 *     * @param selfChange 此值意义不大 一般情况下该回调值false     */    @Override    public void onChange(boolean selfChange, Uri uri) {        // 第一次回调 不是我们想要的 直接返回        if (uri.toString().equals("content://sms/raw")) {            return;        }        // 第二次回调 查询收件箱里的内容        Uri inboxUri = Uri.parse("content://sms/inbox");        // 按时间顺序排序短信数据库        Cursor cursor = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");        if (cursor == null) {            return;        }        if (cursor.moveToFirst()) {            // 获取手机号            String address = cursor.getString(cursor.getColumnIndex("address"));            // 获取短信内容            String body = cursor.getString(cursor.getColumnIndex("body"));            // 判断手机号是否为目标号码,服务号号码不固定请用正则表达式判断前几位。            if (!address.equals("123456789")) {                return;            }            // 正则表达式截取短信中的6位验证码            Pattern pattern = Pattern.compile("(\\d{6})");            Matcher matcher = pattern.matcher(body);            // 如果找到通过Handler发送给主线程            if (matcher.find()) {                String code = matcher.group(0);                mHandler.obtainMessage(0, code).sendToTarget();            }        }        cursor.close();    }}

Activity 关键代码

public class LoginActivity extends BaseActivity {    @BindView(R.id.edit_password)    EditText editTextVerify;    Handler mHandler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            if (editTextVerify != null) {                editTextVerify.setText((String) msg.obj);            }            return true;        }    });    /**     * 监听是否收到验证码的短信     */    private void setMsgObserver() {        SMSContentObserver smsContentObserver = new SMSContentObserver(this, mHandler);        getContentResolver().registerContentObserver(Uri.parse("content://sms/"),                true, smsContentObserver);    }}

添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_SMS" />

本人在6.0上测试没问题

0 1
原创粉丝点击