Android提取短信中的验证码

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

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"/>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章