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