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=? 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