在近期支付项目中遇到各种业务需要进行短信验证的情况,以前遇到过注册、找回密码也需要,但并非业务流程。自动化过程中会把忽略这样的用例,这次是不行了必须要解决这个问题。
本次项目用的是robotium框架,开始也想过直接在apk中添加短信监听,但是一直失败。为了不影响进度只能换一个方案解决。于是就想到单独做一个apk安装到手机上,当短信来了就获取短信的验证码并写入到SD卡中。然后case中再读取该验证码,顺利解决。下边贴上源码,水平有限,海涵。
短信监听类:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.telephony.SmsMessage;
import android.util.Log;
public class SmsReceiver extends BroadcastReceiver {
protected static final String TAG = "log";
public static String getCode(String body, int times) {
Pattern p = Pattern.compile("(?<![a-zA-Z0-9])([a-zA-Z0-9]{" + times + "})(?![a-zA-Z0-9])");
Matcher m = p.matcher(body);
if (m.find()) {
System.out.println(m.group());
return m.group(0);
}
return null;
}
public void writen(String f, String content) {
try {
File file = new File(Environment.getExternalStorageDirectory(), f);
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write(content);
bw.flush();
Log.i(TAG, "写入成功");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onReceive(Context context, Intent intent) {
String str = "验证码";
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras();
SmsMessage msg = null;
if (null != bundle) {
Object[] smsObj = (Object[]) bundle.get("pdus");
for (Object object : smsObj) {
msg = SmsMessage.createFromPdu((byte[]) object);
String content = msg.getDisplayMessageBody();
Log.i(TAG, msg.getDisplayMessageBody());
String from = msg.getOriginatingAddress();
Log.i(TAG, from);
if (msg.getOriginatingAddress().equals("10086)) {
if(content.indexOf(str)!=-1){
Log.i(TAG, "包含验证码");
String sb = getCode(msg.getDisplayMessageBody(), 4);
Log.i(TAG, sb);
this.writen("sb.txt",sb);
}else{
Log.i(TAG,"无需获取验证码");
}
}
}
}
}
}
}
AndroidManifest.xml文件中添加权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注册监听:
<receiver android:name=".SmsReceiver" >
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>