Android实现短信验证码自动填写功能
作者:_Hi_xiaoyu 时间:2022-01-21 13:12:10
本实例为大家分享了Android实现短信验证码自动填写功能,供大家参考,具体内容如下
实现思路很简单:
1、在需要输入验证码的Activity代码注册监听短信的广播
2、拦截短信,获取其中的验证码
3、回写到EditText
private SmsReciver smsReciver = new SmsReciver();
/** 收到短信Action **/
String ACTION_SMS_RECIVER = "android.provider.Telephony.SMS_RECEIVED";
/**
* 注册广播接受者监听短信验证码自动回写 可在onCreate()中进行注册;
*/
private void registSmsReciver() {
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_SMS_RECIVER);
// 设置优先级 不然监听不到短信
filter.setPriority(1000);
registerReceiver(smsReciver, filter);
}
/**
* 短信广播接受者 用户监听短信,自动填写验证码
*/
private class SmsReciver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for (Object obj : objs) {
yte[] pdu = (byte[]) obj;
SmsMessage sms = SmsMessage.createFromPdu(pdu);
// 短信的内容
String message = sms.getMessageBody();
Log.d("log", "message " + message);
// 短息的手机号,如果你们公司发送验证码的号码是固定的这里可以进行一个号码的校验
String from = sms.getOriginatingAddress();
Log.d("log", "from " + from);
analysisVerify(message);
}
}
}
/**
* 解析短信并且回写 这里解析的是纯数字的短信,如果小伙伴的验证码包含字母的话,可用正则替换
*
* @param message
*/
private void analysisVerify(String message) {
char[] msgs = message.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < msgs.length; i++) {
if ('0' <= msgs[i] && msgs[i] <= '9') {
sb.append(msgs[i]);
}
}
mEtVerifyCode.setText(sb.toString());
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消短信广播注册
if (smsReciver != null) {
unregisterReceiver(smsReciver);
smsReciver = null;
}
}
可以看到代码逻辑比较简单,需要注意的有几点。我们这里用的代码注册广播,之所以不采取全局广播的形式原因有两天,在高版本的api,注册全局的短信监听会失效。而且就业务而言,我们监听短信只会在输入验证码的Activity里面才会用到,采用代码注册的形式,在当前Activity销毁的时候取消广播注册,更符合我们的预期,提高应用的性能。
第二个需要注意的问题是优先级的问题。
filter.setPriority(1000);
可以看到,我们这里把优先级设置成了最大。保证我们的应用能够尽可能的接受到短信。注意,我使用的是“尽可能”,也就是说我们不能保证短信自动填写一定能执行成功,有个小伙伴可能会问,我们不是把优先级设置成了最高了吗?
为什么还不能保证了?
原因其实很简单,你能把监听短信的优先级设置成最大,同样的,其他的应用也能把短信监听的优先级设置成最大。比如说,你的手机安装有360安全卫士,把你们公司的验证码视为垃圾短信拦截了,这个时候短信拦截就失效了。
标签:Android,短信,验证码
0
投稿
猜你喜欢
Default Methods实例解析
2023-05-18 19:28:01
Java Socket实现传输压缩对象的方法示例
2022-12-18 06:52:30
java导出Excel文件的步骤全纪录
2021-10-04 11:18:38
SpringBoot2 实现JPA分页和排序分页的案例
2022-02-23 13:26:08
C#中DataTable 转换为 Json的方法汇总(三种方法)
2021-12-12 16:41:00
浅谈BeanPostProcessor加载次序及其对Bean造成的影响分析
2022-05-02 19:52:29
ActiveMQ结合Spring收发消息的示例代码
2023-11-24 06:01:12
Go Java算法之找不同示例详解
2021-10-29 19:37:08
SpringCloud Feign远程调用实现详解
2021-09-28 11:35:15
SpringBoot启动自动终止也不报错的原因及解决
2023-01-16 02:15:40
springmvc 中dao层和service层的区别说明
2022-07-26 00:55:41
Maven构建时跳过部分测试的实例
2022-08-30 03:42:50
优化spring boot应用后6s内启动内存减半
2021-09-13 02:47:59
Java非侵入式API接口文档工具apigcc用法详解
2023-11-24 10:01:00
基于javaWeb 项目SSM配置要点及可能遇到的问题和解决方法
2023-10-27 21:45:16
java内存模型jvm虚拟机简要分析
2022-09-08 09:29:34
Android开发新手常见的10个误区
2021-07-30 02:14:10
mybatis-plus QueryWrapper自定义查询条件的实现
2023-04-05 20:50:07
Spring Boot启动端口修改方法
2022-11-21 19:37:53
盘点MQ中的异常测试
2022-05-06 07:39:24