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,大功告成.