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