您的位置:首页 > 移动开发 > Android开发

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=? and
      if (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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: