使用广播接收者
1. 创建短信广播接收者
/**
* 项目名称:SSZPbaoliu
* 类描述: 短信广播接受者 (实现自动填写验证码功能)
* 创建人:my
* 创建时间:2016/6/16 12:50
* 修改人:my
* 修改时间:2016/6/16 12:50
* 修改备注:
*/
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Object[] objs= (Object[]) intent.getExtras().get("pdus");//拿到短信数组
//遍历 强制转换
for(Object obj:objs){
byte[] pdu=(byte[])obj;
SmsMessage sms = SmsMessage.createFromPdu(pdu);
String messageBody = sms.getMessageBody();//短信内容
//使用正则表达式提取内容中的验证码
Pattern pattern=Pattern.compile("(\\d{6})");//6位连续验证码
Matcher matcher = pattern.matcher(messageBody);
if(matcher.find()){
String cont=matcher.group(0);
//这里实现回调接口
if(mMessageListener!=null){
mMessageListener.onReceived(cont);
}
}
}
}
private MessageListener mMessageListener;
public void setMessageListener(MessageListener messageListener){
this.mMessageListener=messageListener;
}
public interface MessageListener{
void onReceived(String cont);
}
}
2. 注册非常驻广播接收者
- 这里不适合使用常驻型广播
- action: android.provider.Telephony.SMS_RECEIVED
- 一定要设置优先级
/**
* 注册短信广播接收者
*/
private void registSmsReciver(){
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
intentFilter.setPriority(1000);//优先级
mSmsReceiver = new SMSReceiver();
registerReceiver(mSmsReceiver,intentFilter);//注册广播
mSmsReceiver.setMessageListener(new SMSReceiver.MessageListener() {
@Override
public void onReceived(String cont) {
//拦截短信验证码的回调
etVcode.setText(cont);
etVcode.setSelection(cont.length());//光标位置
}
});
}
@Override
protected void onDestroy() {//注销短信广播接收者
super.onDestroy();
if(mSmsReceiver!=null){
unregisterReceiver(mSmsReceiver);
mSmsReceiver=null;}
}
3 权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/>
4 demo
链接:http://pan.baidu.com/s/1miJCfkG 密码:znof