在进行手机验证码验证时,为了提升用户体验,实现自动截取验证填充的行式,实现这个功能有两种方法,分别是利用android的广播机制和android的ContentObserver 实现。
第一种的实现方法如下:
/**
* 监听返回的验证码信息,并自动补充如验证码输入框中 [一级方法]
*/
public BroadcastReceiver getMessageReceive = new BroadcastReceiver() {
String address;
@Override
public void onReceive(Context context, Intent intent) {
Log.v(TAG+"--BroadcastReceiver --", "进入onReceive");
String msgCode = null;
if (intent.getAction().equals(
"android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus) {
SmsMessage message = SmsMessage
.createFromPdu((byte[]) pdu);
// 获取短信的正文内容
content = message.getMessageBody().trim();
// 获取短信的发送者
address = message.getOriginatingAddress();
}
Log.v(TAG+"BroadcastReceiver address", "手机号=="
+ address);
if (address != null && address.equals("10658464")) {
String regex = "\\d*";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(content);
while (m.find()) {
if (m.group().length() == 6) {
msgCode = m.group();
}
}
Log.v(TAG+" BroadcastReceiver msgCode",
"验证码==" + msgCode);
metVerify.setText(msgCode);
}
}
}
}
};
在activity 中的oncreate方法中,需要注册这个广播:
filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
getApplicationContext().registerReceiver(getMessageReceive, filter);
这样,在接收到短信后,会发送广播,然后进行截取,但这个方法在android4.4后,部分手机就无法正常截取,因此推荐使用第二个方法。
第二个方法实现如下:
/**
* 监听短信数据库
*/
class SmsContent extends ContentObserver {
private Cursor cursor = null;
public SmsContent(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//读取收件箱中指定号码的短信
cursor = managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},
" address=? and read=?", new String[]{"10658464", "0"}, "_id desc");//按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了
if (cursor != null && cursor.getCount() > 0) {
ContentValues values = new ContentValues();
values.put("read", "1"); //修改短信为已读模式
cursor.moveToNext();
int smsbodyColumn = cursor.getColumnIndex("body");
String smsBody = cursor.getString(smsbodyColumn);
ed_mmscode.setText(getDynamicPassword(smsBody));
}
//在用managedQuery的时候,不能主动调用close()方法, 否则在Android 4.0+的系统上, 会发生崩溃
if(Build.VERSION.SDK_INT < 14) {
cursor.close();
}
}
}
种用内容观查者,在接收到短信后,发生变化时,触发onChange 方法。这种方法在测试的手机上均可拦截,故推荐大家使用这种方法,附demo 下载 :https://github.com/maliankun/intercept/archive/master.zip
转载于:https://blog.51cto.com/kunyali/1660893