android拖动验证码,Android app获取短信验证码,并自动填充

实现方式思路:

1、系统有一个ContentObserver,可以在onChange(boolean selfChange, Uri uri)里过滤处理短信

2、必须要调用getContentResolver().registerContentObserver(uri, true, mObserver),注册之后才可以监听(ContentObserver才会生效)

实现步骤:目前是在Activity中实现

1、先知道系统短信url:Uri uri = Uri.parse("content://sms")

2、这里可以继承ContentObserver,重新一个SmsObserver类处理短信

3、创建一个内容观察对象:SmsObserver mObserver = new SmsObserver(this, mHandler, MSG_RECEIVED_CODE);这里只是用了Hnader进行处理接收验证码,也可以使用EventBus等进行处理消息传递

4、注册getContentResolver().registerContentObserver(uri, true, mObserver)

5、在opause()或onDestroy()中反注册getContentResolver().unregisterContentObserver(mObserver)

实现的关键源码:

1、Activity

private Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

if (msg.what == MSG_RECEIVED_CODE) {

String code = (String) msg.obj;

mEtUserVerificationCode.setText(code);

}

}

};

mObserver = new SmsObserver(this, mHandler, MSG_RECEIVED_CODE);

Uri uri = Uri.parse("content://sms");

getContentResolver().registerContentObserver(uri, true, mObserver);

2、SmsObserver类

public class SmsObserver extends ContentObserver {

private Context mContext;

private Handler mHandler;

private int mReceivedCode = 1;

public SmsObserver(Context context, Handler handler, int received_code) {

super(handler);

mContext = context;

mHandler = handler;

mReceivedCode = received_code;

}

@Override

public void onChange(boolean selfChange, Uri uri) {

super.onChange(selfChange, uri);

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 address = c.getString(c.getColumnIndex("address"));

String body = c.getString(c.getColumnIndex("body"));

LogUtils.e("发件人为:" + address + "》》》》短信内容为:" + body);

Pattern pattern = Pattern.compile("(\\d{4,6})");

Matcher matcher = pattern.matcher(body);

if (matcher.find()) {

code = matcher.group(0);

LogUtils.e("验证码》》》" + code);

ClipboardManager cmb = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);

cmb.setText(code);

mHandler.obtainMessage(mReceivedCode, code).sendToTarget();

}

}

c.close();

}

}

}

参考:https://blog.csdn.net/qq_31939617/article/details/77430688

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值