android发送短信验证码并自动获取验证码填充文本框
android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框。
一.接入短信平台
首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com),
两分钟申请测试账号,赠送了100条测试短信。
android使用java的jar包即可开发
jar下载: http://smsow.zhenzikj.com/doc/sdk.html
API文档:http://smsow.zhenzikj.com/doc/java_sdk_doc.html
使用测试账号登录管理后台获取appId、appSecret, 地址: http://sms.zhenzikj.com/zhenzisms_user
在"我的应用"->"详情"中打开:
1.安装
下载后的SDK只包含一个jar文件,并且不依赖任何其他jar包或文件,直接导入到工程中即可使用。
2.用法
使用事先申请的AppId、AppSecret初始化ZhenziSmsClient:
ZhenziSmsClient client = new ZhenziSmsClient(appId, appSecret);
AppId、AppSecret是短信平台分配的
1)发送短信
String result = client.send("15811111111", "您的验证码为4534,有效时间为5分钟");
send方法用于单条发送短信
参数1:接收者手机号码,参数2:短信内容
返回结果是json格式的字符串, code: 发送状态,0为成功。非0为发送失败,可从data中查看错误信息
{
"code":0,
"data":"发送成功"
}
二. 自动获取验证码
大致思路
需要做以下几步:
获取短信内容
判断短信中是否含有验证码,如果有则提取出来,如果没有就告知用户没有匹配出短信验证码
将匹配出的短信验证码填充到文本框中
开始制作
1.)申请短信权限
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收短信权限 -->
<uses-permission android:name="android.permission.READ_SMS" /> <!-- 读取短信权限 -->
注意!!!
由于Google在Android6.0引入了运行时权限,使得只要API版本大于23的都需要进行权限的申请,在这里推荐使用一个非常简单快速的第三方库来进行运行时权限的申请,Android 6.0运行时权限第三方库的使用—–RxPermissions
2.)注册短信接收者
我们知道,每当系统接收到一条短信便会发出一条广播,
为此,我们首先需要做的就是配置一个广播接收者来响应这条广播
AndroidManifest.xml文件中配置短信接受者:
<receiver android:name=".SMSReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
注意设置此广播接收者的级别为最高(1000)
SMSReceiver.java
public class SMSReceiver extends BroadcastReceiver { private static final String TAG = "SMSReceiver"; @Override
public void onReceive(Context context, Intent intent) {
//进行获取短信的操作
getMsg(context, intent); }
}
3.)接下来进行短信内容的获取
private void getMsg(Context context, Intent intent) {
//pdus短信单位pdu
//解析短信内容
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
assert pdus != null;
for (Object pdu : pdus) {
//封装短信参数的对象
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
String number = sms.getOriginatingAddress();
String body = sms.getMessageBody();
//写自己的处理逻辑
//获取短信验证码
getCode(context, body);
}
}
通过SmsMessage对象可以得到短信的发送号码,短信内容及相关信息。
匹配出验证码并复制到剪贴板
这里我们就把验证码放到剪切板了,当然你也可以直接把它填充到文本框中
private void getCode(Context context, String body) {
//获取剪贴板管理器:
ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); Pattern pattern1 = Pattern.compile("(\\d{6})");//提取六位数字
Matcher matcher1 = pattern1.matcher(body);//进行匹配 Pattern pattern2 = Pattern.compile("(\\d{4})");//提取四位数字
Matcher matcher2 = pattern2.matcher(body);//进行匹配 if (matcher1.find()) {//匹配成功
String code = matcher1.group(0);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", code);
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
Toast.makeText(context, "验证码复制成功", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onReceive: " + code);
} else if (matcher2.find()) {
String code = matcher2.group(0);
// 创建普通字符型ClipData
ClipData mClipData = ClipData.newPlainText("Label", code);
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData);
Toast.makeText(context, "验证码复制成功", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onReceive: " + code);
} else {
Toast.makeText(context, "未检测到验证码", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onReceive: " + "未检测到验证码");
}
}
在这里通过正则表达式匹配出短信内容中的验证码,因为验证码大多数为4位或者6位,所以在这里为了简化就直接进行了4位验证码和6位验证码的判断
ok,大功告成.
最新文章
- 修复 OS X 的系统盘出现 Invalid Node Structure 问题
- LINQ系列:LINQ to SQL Transact-SQL函数
- SQL SERVER--DBA 常用到的一些脚本
- 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解
- PHP中fopen,file_get_contents,curl函数的区别
- 【转】【C#】C#重绘windows窗体标题栏和边框
- [Effective JavaScript 笔记]第19条:熟练掌握高阶函数
- 在easyui datagrid中formatter数据后使用linkbutton
- java 环境变量配置
- Gradle 1.12 翻译——第十六章. 使用文件
- APP热更新方案
- Chinese Rings hdu 2842 矩阵快速幂
- 网页头部 lang的声明
- mysql索引类型和索引方法
- CSS怎么在项目里引入自定义字体(@font-face)
- String总结
- HTML学习笔记Day13
- Activity插件化解决方案
- Android Studio编译报错“java.lang.OutOfMemoryError: GC overhead limit exceeded
- Java学习笔记35(sql补充)
热门文章
- [物理学与PDEs]第1章第3节 真空中的 Maxwell 方程组, Lorentz 力 3.2 Lorentz 力
- CentOS7.3安装VirtualBox
- C# - 操作符
- laravel5.4 导出 Excel 表格
- python学习第20天
- 洛谷P5206 [WC2019]数树 [容斥,DP,生成函数,NTT]
- 末学者daylight__Linux磁盘管理及LVM
- ELK统一日志系统的应用
- INotifyPropertyChanged 接口
- 我的 Putty 配色方案