《Android-自动填充验证码》

验证码自动填充首先应该考虑的就是如何获取短信,而后读取短信内容来实现。java

我能想到的有两种方式。android

一、ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引发的数据库的变化,继而作一  些相应的处理,它相似于  数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。数据库

二、BroadcastReceiver——广播。只要加入IntentFilter也能拦截部分本身想要作的事情。ide

下面我来一一介绍他们的实现:函数

ContentObserver:this

首先要定义一个ContentObserver的实现.net

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

import com.wumart.lib.common.DLog;

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


public class SmsContent extends ContentObserver {
    public static final String SMS_URI_INBOX = "content://sms/inbox";//短信收信箱的URI
    public static final String SMS_ADDRESS = "电话号码";//须要监听的电话号码
    private Context mContext;//内容上下文
    private SmsContentListener mSmsContentListener;//回调函数

    public SmsContent(Context context,SmsContentListener smsContentListener) {
        super(new Handler());
        this.mContext = context;
        this.mSmsContentListener=smsContentListener;
    }

     @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Cursor cursor = null;
        try {
            cursor = mContext.getContentResolver().query(Uri.parse(SMS_URI_INBOX), new String[]{"_id", "address", "body", "read"}, "address like ? and read=?",
                    new String[]{SMS_ADDRESS, "0"}, "date desc");
            if (cursor != null) {
                cursor.moveToFirst();
                if (cursor.moveToFirst()) {
                    String smsbody = cursor.getString(cursor.getColumnIndex("body"));
                    String smsContent = patternCode(smsbody);
                    if (null != mSmsContentListener && !TextUtils.isEmpty(smsContent))
                        mSmsContentListener.onSmsContentBack(smsContent);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != cursor)
                cursor.close();
        }
    }

    private  String patternCode(String patternContent) {
        if(TextUtils.isEmpty(patternContent))
            return null;
        Pattern p = Pattern.compile("(?<!\\d)\\d{6}(?!\\d)");
        Matcher matcher = p.matcher(patternContent);
        if (matcher.find())  return matcher.group();
        return null;
    }

    public interface SmsContentListener {
        void onSmsContentBack(String result);
    }
}

固然还需在activity或者fragment中来调用它code

SmsContent mSmsContent=new SmsContent(this, this) 
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, mSmsContent);
在onDestroy的时候仍是须要
getContentResolver().unregisterContentObserver(mSmsContent)

BroadcastReceiver:server

首先初始化广播get

public static final String PHONE="电话号码";
 //短信验证码内容 验证码是6位数字的格式
    private String strContent;
    private String patternCoder = "(?<!\\d)\\d{6}(?!\\d)";
 private BroadcastReceiver smsReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Object[] objs = (Object[]) intent.getExtras().get("pdus");
            for (Object obj : objs) {
                byte[] pdu = (byte[]) obj;
                SmsMessage sms = SmsMessage.createFromPdu(pdu);
                // 短信的内容
                String message = sms.getMessageBody();
                String from = sms.getOriginatingAddress();
                if (!ScrmUtil.isEmpty(from) && from.startsWith(PHONE)) {
                    String code = patternCode(message);
                    if (!ScrmUtil.isEmpty(code)) {
                        strContent = code;
                        mHandler.sendEmptyMessage(1);
                    }
                }
            }
        }
    };

//主要是更新UI
 private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            if (codeEdtv != null) {
                codeEdtv.setText(strContent);
                codeEdtv.setClearIconVisible(false);
            }
            try {
                unregisterReceiver(smsReceiver);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    };

  /**
     * 匹配短信中间的6个数字(验证码等)
     */
    private String patternCode(String patternContent) {
        if (ScrmUtil.isEmpty(patternContent))  return null;
        Pattern p = Pattern.compile(patternCoder);
        Matcher matcher = p.matcher(patternContent);
        if (matcher.find())  return matcher.group();
        return null;
    }

而后在activity中和fragment中注册广播

public void addReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        filter.setPriority(Integer.MAX_VALUE);
        registerReceiver(smsReceiver, filter);

    }

在onDestroy也仍是须要取消监听,否则会出问题
 unregisterReceiver(smsReceiver);

以上就是自动填充验证码的办法了。写得不是很好,但愿你们指教

相关文章
相关标签/搜索