android 高兼容性的自动填充验证码工具类(四步代码搞定)

验证码自动填充对于移动开发来说是很实用并常见的事。在4.4以前实现验证码填充可以用广播监听,获取验证码。那么4.4以后我们怎么办呢?方法还是有点,或许你以前就是用这种方法来实现的。这是一个工具类,没啥难到的,不多说。对本工具类中提到不懂的类或者字段请自行百度或Bing或Google。

本工具类使用很简单三行代码搞定一个验证码自动填充。

1、在onCreate()中实例化SmsValidateCodeUtils 类,如

mSmsValidateCodeUtils = new SmsValidateCodeUtils(this);
mSmsValidateCodeUtils.register().setOnValidateCodeListener(this)
.setmValidateName(getResources().getString(R.string.SmsValidateCode));

2、重写接口方法

public void resultValidateCode(String code){
  // TODO
}

3、在onDestroy()中注销 mSmsValidateCodeUtils.unregister();

4、在AndroidManifest.xml中加上这个权限

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

是不是很简单啊!该类还可以优化,代码不是很规范。这是一个BUG我正在努力调试中……

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;

/**
 * desc:自动获取短信验证码
 * Created: 2016/5/23.
 */
public class SmsValidateCodeUtils {
    private static final int MSG_RECEIVED_CODE = 1;
    private Context mContext;
    private SmsObserver1 mObserver;
    private String mValidateName = "";
    private String mAddress = "";
    private String mRegex_address = "\\d{4,6}";
    private String mRegex_validateName = "【(([\\u4e00-\\u9fa5]+|\\w+)|([\\u4e00-\\u9fa5]+\\w+)|(\\w+[\\u4e00-\\u9fa5]+))】";
    private OnValidateCodeListener mOnValidateCodeListener;
    private Handler mHandler;

    public SmsValidateCodeUtils(Context context) {
        this.mContext = context;
    }

    private class SmsObserver1 extends ContentObserver {
        public SmsObserver1(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            super.onChange(selfChange, uri);
            Log.e("DEBUG", "SMS has changed!");
            Log.e("DEBUG", uri.toString());
            String code = "";
            if (uri.toString().equals("content://sms/raw")) {
                return;
            }
            Uri inboxUri = Uri.parse("content://sms/inbox");
            Cursor c = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");
            if (c != null) {
                if (c.moveToFirst()) {
                    String tempaddress = c.getString(c.getColumnIndex("address"));
                    String body = c.getString(c.getColumnIndex("body"));
                    Log.e("DEBUG", "发件人为:" + tempaddress + " " + "短信内容为:" + body);
                    Log.e("address ", "".equals(mAddress) + " : " + mAddress);
                    if (!"".equals(mAddress)) {
                        if (!tempaddress.equals(mAddress)) {
                            return;
                        }
                    }
                    Log.e("tempaddress ", " : " + tempaddress);
                    Log.e("validateName", " : " + mValidateName);
                    if (!"".equals(mValidateName)) {
                        Pattern pattern = Pattern.compile(mRegex_validateName);
                        Matcher matcher = pattern.matcher(body);
                        if (matcher.find()) {
                            code = matcher.group(0);
                            Log.e("DEBUG", "name is " + code);
                        }
                        Log.e("validateName", " : " + mValidateName);
                        if (!mValidateName.equals(code)) {
                            return;
                        }
                    }

                    Pattern pattern = Pattern.compile(mRegex_address);
                    Matcher matcher = pattern.matcher(body);
                    if (matcher.find()) {
                        code = matcher.group(0);
                        Log.e("DEBUG", "code is " + code);
                        mHandler.obtainMessage(MSG_RECEIVED_CODE, code).sendToTarget();
                    }
                }
                c.close();
            }
        }
    }

    public SmsValidateCodeUtils setOnValidateCodeListener(OnValidateCodeListener OnValidateCodeListener) {
        mOnValidateCodeListener = OnValidateCodeListener;
        return this;
    }

    public interface OnValidateCodeListener {
        public void resultValidateCode(String code);
    }

    public SmsValidateCodeUtils register() {
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == MSG_RECEIVED_CODE) {
                    String code = (String) msg.obj;
                    Log.e("mHandler ", code);
                    if (null != mOnValidateCodeListener) {
                        mOnValidateCodeListener.resultValidateCode(code);
                        Log.e("resultValidateCode ", code);
                    }
                }
            }
        };
        Uri uri = Uri.parse("content://sms");
        mObserver = new SmsObserver1(mHandler);
        mContext.getContentResolver().registerContentObserver(uri, true, mObserver);
        return this;
    }

    public void unregister() {
        try {
            if (null != mContext) {
                mContext.getContentResolver().unregisterContentObserver(mObserver);
                mContext = null;
                mHandler = null;
                mObserver = null;
                mOnValidateCodeListener = null;
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }

    public String getmValidateName() {
        return mValidateName;
    }

    public SmsValidateCodeUtils setmValidateName(String mValidateName) {
        this.mValidateName = mValidateName;
        return this;
    }

    public String getmRegex_address() {
        return mRegex_address;
    }

    public SmsValidateCodeUtils setmRegex_address(String mRegex_address) {
        this.mRegex_address = mRegex_address;
        return this;
    }

    public String getmRegex_validateName() {
        return mRegex_validateName;
    }

    public SmsValidateCodeUtils setmRegex_validateName(String mRegex_validateName) {
        this.mRegex_validateName = mRegex_validateName;
        return this;
    }

    public String getmAddress() {
        return mAddress;
    }

    public SmsValidateCodeUtils setmAddress(String mAddress) {
        this.mAddress = mAddress;
        return this;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值