/* 动态方式注册广播接收者 */
receiver = new AutoMessageReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(1000 );//设置1000,也有拦截失败的几率,但是很小
filter.addAction("android.provider.Telephony.SMS_RECEIVED" );
getActivity().registerReceiver(receiver , filter);
public class AutoMessageReceiver extends BroadcastReceiver {
/**
* 广播消息类型
*/
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED" ;
protected AutoMessageReceiver() {
super ();
}
@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" );
if (pdus != null && pdus.length > 0 ) {
SmsMessage[] messages = new SmsMessage[pdus.length ];
int length = messages.length ;
for (int i = 0 ; i < length; i++) {
byte [] pdu = (byte []) pdus[i];
messages[i] = SmsMessage.createFromPdu (pdu);
}
for (SmsMessage msg : messages) {
// 获取短信内容
String content = msg.getMessageBody();
String sender = msg.getOriginatingAddress();
// 拦截目标短信
if ("10086" .equals(sender)) {
if (!TextUtils.isEmpty (content)) {
String msgPassword = getNumbers(content);
if (!TextUtils.isEmpty (msgPassword) && isNumeric(msgPassword)) {
// 收到验证码后,启动 APP ,并把验证码传递到页面
mCodeEdit .setText(msgPassword);
break ;
}
}
// 对于特定的内容 , 取消广播
abortBroadcast();
}
}
}
}
}
}
/**
* 截取数字
*
* @param content
* @return
*/
public String getNumbers(String content) {
Pattern pattern = Pattern.compile (" \\ d+" );
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
return matcher.group(0 );
}
return "" ;
}
/**
* < 判断字符串是否是数字 >
*
* @param str
* @return
*/
public boolean isNumeric(String str) {
Pattern pattern = Pattern.compile ("[0-9]*" );
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false ;
}
return true ;
}
}