Android自动填充短信验证码
2016-04-06 09:28
453 查看
Android 5.0之前可以使用BroadcastReceiver监听短信到来的广播 实现自动填充短信验证码 下一 ZMax 不行是android5.0不行
短信到来的广播接收不到 原因谁知道的请告知!
方法二可以使用ContentObserver内容观察者观察未读短信 如果有验证码则查看短信内容 使用正则表达式匹配连续的数字 经测试可行
/*** 配置广播接收者: <receiver android:name=".SMSBroadcastReceiver"> <intent-filter* android:priority="1000"> <action android:name=* "android.provider.Telephony.SMS_RECEIVED"/>* 表示: 设置此广播接收者的级别为最高<uses-permission android:name="android.permission.RECEIVE_SMS"/><uses-permission android:name="android.permission.READ_SMS"/>*/public class SMSBroadcastReceiver extends BroadcastReceiver {private static MessageListener mMessageListener;public SMSBroadcastReceiver() {super();}@Overridepublic void onReceive(Context context, Intent intent) {Object[] pdus = (Object[]) intent.getExtras().get("pdus");for (Object pdu : pdus) {SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);String sender = smsMessage.getDisplayOriginatingAddress();String content = smsMessage.getMessageBody();long date = smsMessage.getTimestampMillis();Date timeDate = new Date(date);SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = simpleDateFormat.format(timeDate);System.out.println("短信来自:" + sender);System.out.println("短信内容:" + content);System.out.println("短信时间:" + time);mMessageListener.OnReceived(getDynamicPassword(content));}}
/*** 从字符串中截取连续6位数字组合 ([0-9]{" + 6 + "})截取六位数字 进行前后断言不能出现数字 用于从短信中获取动态密码* @param str* 短信内容* @return 截取得到的6位动态密码*/public String getDynamicPassword(String str) {// 6是验证码的位数一般为六位Pattern continuousNumberPattern = Pattern.compile("(?<![0-9])([0-9]{"+ 6 + "})(?![0-9])");Matcher m = continuousNumberPattern.matcher(str);String dynamicPassword = "";while (m.find()) {System.out.print(m.group());dynamicPassword = m.group();}return dynamicPassword;}// 回调接口 public interface MessageListener { public void OnReceived(String message); } public void setOnReceivedMessageListener(MessageListener messageListener) { this.mMessageListener = messageListener; } }
/*** 读取短信内容 自动填充验证码* android 5.0 后使用contentObserver获取短信验证码 !!
添加权限<uses-permission android:name="android.permission.READ_SMS"/>
* @author **/public class SmsContentObserver extends ContentObserver {public static final String SMS_URI_INBOX = "content://sms/inbox";private Activity activity = null;private String smsContent = "";private EditText verifyText = null;public SmsContentObserver (Handler handler) {super(handler);}public SmsContentObserver (Activity activity, Handler handler, EditText verifyText) {super(handler);this.activity = activity;this.verifyText = verifyText;}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);Cursor cursor = null;// 光标// 读取收件箱中所有未读短信cursor = activity.getContentResolver().query(Uri.parse(SMS_URI_INBOX), new String[] {"_id", "address", "body", "read", "date" }, " read=?",new String[] { "0" }, "date desc");//"1069035660623", address=? andif (cursor != null) {// 如果短信为未读模式 cursor.moveToFirst(); if (cursor.moveToFirst()) { String smsbody = cursor .getString(cursor.getColumnIndex("body")); LogUtils.e("smsbody:" + smsbody); smsContent = getDynamicPassword(smsbody);//验证码 verifyText.setText(smsContent); verifyText.setSelection(verifyText.getText().toString().trim().length()); } } } /** * 从字符串中截取连续6位数字组合 ([0-9]{" + 6 + "})截取六位数字 进行前后断言不能出现数字 用于从短信中获取动态密码 * @param str * 短信内容 * @return 截取得到的6位动态密码 */ public String getDynamicPassword(String str) { // 6是验证码的位数一般为六位 Pattern continuousNumberPattern = Pattern.compile("(?<![0-9])([0-9]{" + 6 + "})(?![0-9])"); Matcher m = continuousNumberPattern.matcher(str); String dynamicPassword = ""; while (m.find()) { System.out.print(m.group()); dynamicPassword = m.group(); } return dynamicPassword; }}调用该方法的地方的代码:
//调用该方法的地方的代码smsContent = new SmsContentObserver(SignUpActivity.this, new Handler(), yanzhengma);//最后一个参数是验证码EditText
// 注册短信变化监听getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, smsContent );正则表达式连接地址参考http://blog.csdn.net/q178266871/article/details/51072181
相关文章推荐
- 在 Android 下使用 FrameBuffer 绘图
- Android权限设置android.permission完整列表
- Android Error:Failed to install *.apk on device *: timeout Launch canceled!
- Please ensure that adb is correctly located at ‘F:\Android\adt-bund异常的解决之道
- Android中的缩略图
- Android属性动画,android属性
- Android之Intent
- Android Environment 常量含义
- Android系统配置数据库注释(settings.db)
- android 自定义控件
- Android深入浅出之Zygote
- Android 之 内存管理
- Android 之 zygote 与进程创建
- Android——列表视图 ListView(二)SimpleAdapter
- Android——列表视图 ListView(一)Arrayadapter
- Android 蓝牙4.0(BLE) 理解--紧随智能家居和可穿戴设备潮流
- Android Converty问题解决方案
- android oom 内存优化入门,工具mat简单使用(
- Android之Button
- EventBus Demo