只需要定义一个 BroadcastReceiver 直接上代码
import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.telephony.SmsMessage; import android.util.Log; import com.ylt.gxjkz.youliantong.tools.VerifyByZhengZe; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by hutao on 2018/3/21. */ public class SmsReceiver extends BroadcastReceiver { public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";//只要注册声明权限即可收到、阻断 @TargetApi(Build.VERSION_CODES.M) @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (SMS_RECEIVED_ACTION.equals(action)) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); for (Object pdu : pdus) { /* 要特别注意,这里是android.telephony.SmsMessage 可不是 android.telephony.SmsManager */ SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu); String sender = message.getOriginatingAddress(); String content = message.getMessageBody(); Date date = new Date(message.getTimestampMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = dateFormat.format(date); // sendSMS(sender, conetnt, time); Log.i("短信内容", "sender:" + sender + " content:" + content + " time:" + time); if (content.contains("某某公司")) {//哪个平台发来的验证码 例如:【某某公司】您的验证码是070360,有效期5分钟。如非本人操作,请忽略。 getVerifyCode(content, 6);//这个是正则表达式,为了获取短信中的验证码 mMessageListener.onReceived(verifyCode); abortBroadcast();//中断广播的继续传递,防止优先级低的获取到 } } } } } //回调接口 public interface MessageListener { public void onReceived(String message); } MessageListener mMessageListener; public void setOnReceivedMessageListener(MessageListener messageListener) { this.mMessageListener = messageListener; }
/** * 从短信字符窜提取验证码 * * @param body 短信内容 * @param codeLength 验证码的长度 一般6位或者4位 * @return 接取出来的验证码 */ private static String getVerifyCode(String body, int codeLength) { // 首先([a-zA-Z0-9]{YZMLENGTH})是得到一个连续的六位数字字母组合 // (?<![a-zA-Z0-9])负向断言([0-9]{YZMLENGTH})前面不能有数字 // (?![a-zA-Z0-9])断言([0-9]{YZMLENGTH})后面不能有数字出现 // 获得数字字母组合 // Pattern p = Pattern .compile("(?<![a-zA-Z0-9])([a-zA-Z0-9]{" + YZMLENGTH + "})(?![a-zA-Z0-9])"); // 获得纯数字 Pattern p = Pattern.compile("(?<![0-9])([0-9]{" + codeLength + "})(?![0-9])"); Matcher m = p.matcher(body); if (m.find()) { System.out.println(m.group()); return m.group(0); } return null; }}
以上是 BroadcastReceiver 的代码 接下来只需要在Activity或者Fragment里面注册即可
在Activity的的onCreate()方法中调用以下方法
/** * 初始化短信监听广播 */ private void initSMSBroadcastReceiver() { //生成广播处理 mSmsReceiver = new SmsReceiver(); //实例化过滤器并设置要过滤的广播 IntentFilter intentFilter = new IntentFilter(SmsReceiver.SMS_RECEIVED_ACTION); //优先级最高 intentFilter.setPriority(Integer.MAX_VALUE); //注册广播 this.registerReceiver(mSmsReceiver, intentFilter); mSmsReceiver.setOnReceivedMessageListener(new SmsReceiver.MessageListener() { @Override public void onReceived(String message) { Log.i("短信内容的验证码", message); mEtVerifyCode.setText(message);// mEtVerifyCode 这个是EditText 就是你输入验证码的控件 } }); }
还需要在onDestory()方法中注销
this.unregisterReceiver(mSmsReceiver);
以上代码直接copy即可 千万不忘记加权限
<!--获取短信内容的权限--> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" />