Android自动填充短信验证码


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();  
    }  
    @Override  
    public 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;
   }

   @Override
   public 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值