android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框。html
一.接入短信平台java
首先须要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com), android
两分钟申请测试帐号,赠送了100条测试短信。正则表达式
android使用java的jar包便可开发json
jar下载: http://smsow.zhenzikj.com/doc/sdk.htmlapp
API文档: http://smsow.zhenzikj.com/doc/java_sdk_doc.htmlide
使用测试帐号登陆管理后台获取appId、appSecret, 地址: http://sms.zhenzikj.com/zhenzisms_user测试
在"个人应用"->"详情"中打开:.net
下载后的SDK只包含一个jar文件,而且不依赖任何其余jar包或文件,直接导入到工程中便可使用。code
使用事先申请的AppId、AppSecret初始化ZhenziSmsClient:
ZhenziSmsClient client = new ZhenziSmsClient(appId, appSecret);
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,大功告成.