Android提取短信中的验证码

来源:互联网 发布:淘宝名字大全霸气 编辑:程序博客网 时间:2024/06/05 19:10

现在用短信验证码来实现登录和注册功能已经越来越常见了。如果你想用户在收到短信验证码后,不需要再手动输入进去的话,而是自动填入,那么你就需要做些特殊处理了!

1.监听短信变化

    首先需要的是通过ContentObserver类中的OnChange()监听你的短信变化。简单的介绍下ContentObserver:内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理。

2.获取验证码

    检测到了短信变化后,读取该条短信的内容,并且通过正则表达式来获取内容中的验证码。

3.修改UI

    ContentObserver构造方法中有一个handler,通过handler来修改主线程中ui内容,将接收到的验证码呈现在ui上。


贴上代码,代码中有注释讲解:

MainActivity.java

import android.app.Activity;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.TextView;public class MainActivity extends Activity {    private TextView mSmsTV;    private SmsObserver mSmsObserver;    private Handler mHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if(msg.what == 1) {                String code = (String) msg.obj;                mSmsTV.setText(code);            }        }    };    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mSmsTV = (TextView) findViewById(R.id.tv_sms);        mSmsObserver = new SmsObserver(this, mHandler);        Uri smsUri = Uri.parse("content://sms");        getContentResolver().registerContentObserver(smsUri, true, mSmsObserver);//注册短信uri的监听    }    @Override    protected void onPause() {        super.onPause();        getContentResolver().unregisterContentObserver(mSmsObserver);//取消监听    }}

SmsObserver.java

import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;import android.os.Message;import android.util.Log;import java.util.regex.Matcher;import java.util.regex.Pattern;public class SmsObserver extends ContentObserver {    private Context mContext;    private Handler mHandler;//更新ui    public SmsObserver(Context context, Handler handler) {        super(handler);        mContext = context;        mHandler = handler;    }    @Override    public void onChange(boolean selfChange, Uri uri) {        super.onChange(selfChange, uri);        /* 收到一条短信,onChange()会执行两次,uri不同 */        if (uri.toString().equals("content://sms/raw")) {//未写入数据库,不进行任何操作            return;        } else {//此时已经写入数据库            Uri inboxUri = Uri.parse("content://sms/inbox");            /* 按照日期倒序排序 */            Cursor cursor = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");            if (cursor != null) {                if (cursor.moveToFirst()) {//游标移动到first位置                    /* 发件人的号码 */                    String address = cursor.getString(cursor.getColumnIndex("address"));                    /* 短信内容 */                    String body = cursor.getString(cursor.getColumnIndex("body"));                    Log.i("wyk", "address:" + address + ",body:" + body);                    /* 利用正则提取验证码(根据实际情况修改) */                    Pattern pattern = Pattern.compile("(\\d{6})");//提取六位数字                    Matcher matcher = pattern.matcher(body);//进行匹配                    if(matcher.find()){//匹配成功                        String code = matcher.group(0);                        Message msg = mHandler.obtainMessage(1, code);                        mHandler.sendMessage(msg);                        Log.i("wyk","code:"+code);                    }                }                cursor.close();            }        }    }}

最后别忘了再manifest中加入读取短信的权限

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




0 0
原创粉丝点击