在进行手机验证码验证时,为了提升用户体验,实现自动截取验证填充的行式,实现这个功能有两种方法,分别是利用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

更多相关文章

  1. 低版本android project在高版本ADK中运行方法
  2. Android中应用界面主题Theme使用方法和页面定时跳转应用
  3. G1安装android软件方法 (实机运行)
  4. android设置主题和自定义主题的方法
  5. android intent使用方法
  6. Android webkit webkit中skia的使用方法简析
  7. android(java)对网络状态(socket)判断的方法
  8. 安装Android Studio遇到中文乱码的解决方法

随机推荐

  1. Windows 8下MySQL Community Server 5.6
  2. Mars Android视频学习笔记——01_16_SQLi
  3. Activity启动模式详解
  4. Android(安卓)App性能优化之内存优化
  5. 浅谈Android五大布局
  6. Android(安卓)动画系列三:Propety Animati
  7. Android的单选按钮
  8. Android(安卓)AutoCompleteTextView动态
  9. android 登陆、提交数据或加载数据时提示
  10. Android之UI学习篇十:使用TabHost实现微博