场景:注册登录App时需要发送验证码,接收验证码时直接现在在app中
1.onCreate中调用initMessage方法
private void initMessage() {
SMSBroadcastReceiver mSMSBroadcastReceiver=new SMSBroadcastReceiver();
mSMSBroadcastReceiver.setOnReceivedMessageListener(new SMSBroadcastReceiver.MessageListener() {
public void OnReceived(String message) {
edit.setText(getDynamicPassword(message));
Toast.makeText(MainActivity.this, getDynamicPassword(message), Toast.LENGTH_LONG).show();
}
});}
2.getDynamicPassword正则校验,短信为6位数字并且短信里包含“测试应用”四个字
public String getDynamicPassword(String str) {
// 6是验证码的位数一般为六位
Pattern continuousNumberPattern = Pattern.compile("(?<![0-9])([0-9]{"
+ 6 + "})(?![0-9])");
Matcher m = continuousNumberPattern.matcher(str);
Matcher mm=Pattern.compile("测试应用").matcher(str);
String dynamicPassword = "";
while (m.find() && mm.find()) {
System.out.print(m.group());
dynamicPassword = m.group();
}
return dynamicPassword;
}
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(content);
//如果短信来自5556,不再往下传递
if("5556".equals(sender)){
System.out.println(" abort ");
abortBroadcast();
}
}
}
// 回调接口
public interface MessageListener {
public void OnReceived(String message);
}
public void setOnReceivedMessageListener(MessageListener messageListener) {
this.mMessageListener=messageListener;
}
}
3.权限添加:
<!-- 发送短信-->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- 阅读消息 -->
<uses-permission android:name="android.permission.READ_SMS" />
<!-- v写入消息-->
<uses-permission android:name="android.permission.WRITE_SMS" />
<!-- 接收消息 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
4.广播接收者配置
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>