注:转载请注明出处!
在Android开发中,为了达到某种目的,比如为了安全性更好,有些APP需要验证码才能进行某些操作,当接收到验证码短信的时候,验证码会自动填写在输入框中,虽然是个小功能,但是会给用户更好的体验。
要实现上述功能,需要拦截短信,截取短信中的验证码信息,下面让我们一步步来实现。
实现功能:接收到带有验证码的短信后,截取验证码,启动App,把验证码显示在EditText上,此处以拦截10086为例,抛砖引玉,在项目中各位具体情况具体分析。
1.添加权限
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
2.注册广播
- 在AndroidManifest.xml里添加”接收”SMS的权限。
<receiver android:name="com.wangkeke.blogautomessagedemo.AutoMessageReceiver" >
//设置广播的优先级
<intent-filter android:priority="1000" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
3.自定义短信接收广播
public class AutoMessageReceiver extends BroadcastReceiver
{
/**
* 广播消息类型
*/
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
public 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();
// 拦截10086的短信
if ("10086".equals(sender))
{
if (!TextUtils.isEmpty(content))
{
String msgPassword = getNumbers(content);
if (!TextUtils.isEmpty(msgPassword) && isNumeric(msgPassword))
{
//收到验证码后,启动APP,并把验证码传递到页面
Intent newIntent = new Intent(context, MainActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 注意,必须添加这个标记,否则启动会失败
newIntent.putExtra("msg", msgPassword);
context.startActivity(newIntent);
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 static boolean isNumeric(String str)
{
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches())
{
return false;
}
return true;
}
}
4.处理验证码
接收页面,获取验证码后,在EditText上显示验证码内容。
//获取短信验证码,并填充在EditText上
String msg = getIntent().getStringExtra("msg");
editText.setText(msg);
5.实现效果
一 . 默认页面
二 . 接收到短信
三 . 验证码传递到页面