验证码自动填充对于移动开发来说是很实用并常见的事。在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;
}
}