自动截取短信验证码

来源:互联网 发布:机枪升级数据 编辑:程序博客网 时间:2024/06/04 18:15

现在很多app已经有了自动截取短信验证码的功能,更好的可以给用户好的体验感,以下我们就进行一点下短信的自动截取。


首先应该进行一下几点:


1、首先创建一个类继承自ContentObserver,类实现onChange()的方法。(onchange方法是在观察的Uri发生改变时触发)

2、在activity中注册一个内容观察者

3、在onDestroy方法中进行注销内容观察者


一、下面是继承自ContentObserver中的代码

package com.example.smscode;

import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by wangchaoon 17/1/21.
 */

public class SmsContentObserver extends ContentObserver {
    private final Handler handler;
    private final Context context;


//传一个context,和handler与activity进行交互
    public SmsContentObserver(Handler handler, Context context) {
        super(handler);
        this.context = context;
        this.handler = handler;
    }

    /**
     * 当想要观察的对应的uri发生改变的时候,触发
     *
     * @param selfChange
     */
    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        //查询出最新的短信
        Uri smsUri = Uri.parse("content://sms/inbox");
        //查询数据库
        Cursor cursor = context.getContentResolver().query(smsUri, null, null, null, "date desc");
        StringBuilder stringBuilder = new StringBuilder();
        if (cursor.moveToNext()) {
//            String address = cursor.getString(cursor.getColumnIndex("address"));
            String body = cursor.getString(cursor.getColumnIndex("body"));
            stringBuilder.append(body);
        }
        Pattern pattern = Pattern.compile("(\\d{6})");//正则表达式,来截取连续的6位数字
        Matcher matcher = pattern.matcher(stringBuilder.toString());
        if (matcher.find()) {
            String     code = matcher.group(0);

//将截取下来的数字通过handler发送给activity

            handler.obtainMessage(0, code).sendToTarget();
        }

    }
}

二、Activity中进行注册和接受handler发送的消息


package com.example.smscode;

import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            String message = (String) msg.obj;
            tv.setText(message);
        }
    };

    private TextView tv;
    private SmsContentObserver smsContentObserver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        //观察短信
        Uri uri = Uri.parse("content://sms");
        smsContentObserver = new SmsContentObserver(handler, this);
        //注册一个内容观察者
        getContentResolver().registerContentObserver(uri, true,smsContentObserver );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getContentResolver().unregisterContentObserver(smsContentObserver);
    }
}


通过以上的代码就可以简单的实现短信验证码的自动截取,理解了核心就可以把这段代码用到自己的项目需求中了。

1 0
原创粉丝点击