android 注册发送短信验证码并自动获取短信, 截取数字验证码填充文本框.
一. 接入短信平台
首先需要选择短信平台接入, 这里使用的是榛子云短信平台 http://smsow.zhenzikj.com/ (http://smsow.zhenzikj.com), https://blog.csdn.net/
两分钟申请测试账号, 赠送了 100 条测试短信.
android 使用 java 的 jar 包即可开发
jar 下载: http://smsow.zhenzikj.com/doc/sdk.html
API 文档: http://smsow.zhenzikj.com/doc/java_sdk_doc.html 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 http://blog.csdn.net/qq_33923079/article/details/53453607
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, 大功告成.
来源: http://www.bubuko.com/infodetail-2703183.html