仿照淘宝支付宝等,自动获取服务器端发来的验证码,实际是监听特定的号码的内容,主要方法如下:
当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。最好使用动态注册的方法,去注册自定义的广播。
public class MainActivity extends Activity {
private IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
private smsBroadcastReceiver smsBR = new smsBroadcastReceiver();
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) this.findViewById(R.id.et);
intentFilter.setPriority(2147483647);// 设置优先级
}
@Override
protected void onStart() {
super.onStart();
registerReceiver(smsBR, intentFilter);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(smsBR);
}
/**
* 内部类 用于监听短信
*
* @author Administrator
*
*/
private class smsBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
String fromNumber = smsMessage[n].getOriginatingAddress();
String content = smsMessage[n].getMessageBody();
// 消息时间
// String time = DateUtil.dateToStr(new Date(smsMessage[n].getTimestampMillis()));
if (fromNumber.equals("10086")) {
// 如果是特定的电话号码的,则取出验证码
tv.setText(patternCode(content));
} else {
// 这里做实验,同样不管接到谁的短信,都取出连续六位数字
tv.setText(patternCode(content));
}
}
}
}
/**
* 6个数字的正则表达式
*/
private String patternCoder = "(?<!\\d)\\d{6}(?!\\d)";
/**
* 匹配短信中间的6个数字(验证码等)
*
* @param patternContent
* @return
*/
public String patternCode(String patternContent) {
if (TextUtils.isEmpty(patternContent)) {
return null;
}
Pattern p = Pattern.compile(patternCoder);
Matcher matcher = p.matcher(patternContent);
if (matcher.find()) {
return matcher.group();
}
return null;
}
}
如果是真机验证,最好和10086等服务号聊聊,如果是用虚拟机,使用eclipse的DDMS功能
进入DDMS:通过菜单Windows→Open Perspective→DDMS或者对应的图标进入DDMS的界面。
发短信前设置:点击DDMS的界面上面的Emulator Control,然后按图所示配置,其中模拟器的端口号就是模拟器的电话号码。
短信接收:点击Emulator Control中的Send按钮后就可以在安卓系统中看到信息栏提示,到安卓系统的短信应用里就可以看到短信内容了。