android注冊發(fā)送短信驗(yàn)證碼并自動(dòng)獲取短信舵变,截取數(shù)字驗(yàn)證碼填充文本框蚁孔。
一.接入短信平臺(tái)
首先需要選擇短信平臺(tái)接入睬魂,這里使用的是榛子云短信平臺(tái)(http://smsow.zhenzikj.com),
兩分鐘申請測試賬號模庐,贈(zèng)送了100條測試短信瑞你。
android使用java的jar包即可開發(fā)
jar下載:http://smsow.zhenzikj.com/doc/sdk.html
API文檔:?http://smsow.zhenzikj.com/doc/java_sdk_doc.html
使用測試賬號登錄管理后臺(tái)獲取appId酪惭、appSecret, 地址:http://sms.zhenzikj.com/zhenzisms_user
在"我的應(yīng)用"->"詳情"中打開:
下載后的SDK只包含一個(gè)jar文件,并且不依賴任何其他jar包或文件者甲,直接導(dǎo)入到工程中即可使用春感。
使用事先申請的AppId、AppSecret初始化ZhenziSmsClient:
ZhenziSmsClient?client?=?new?ZhenziSmsClient(appId,?appSecret);
AppId虏缸、AppSecret是短信平臺(tái)分配的
String?result?=?client.send("15811111111",?"您的驗(yàn)證碼為4534鲫懒,有效時(shí)間為5分鐘");
send方法用于單條發(fā)送短信
參數(shù)1:接收者手機(jī)號碼,參數(shù)2:短信內(nèi)容
返回結(jié)果是json格式的字符串, code: 發(fā)送狀態(tài)刽辙,0為成功窥岩。非0為發(fā)送失敗,可從data中查看錯(cuò)誤信息
{
????"code":0,
????"data":"發(fā)送成功"
}
二. 自動(dòng)獲取驗(yàn)證碼
大致思路
需要做以下幾步:
獲取短信內(nèi)容
判斷短信中是否含有驗(yàn)證碼扫倡,如果有則提取出來谦秧,如果沒有就告知用戶沒有匹配出短信驗(yàn)證碼
將匹配出的短信驗(yàn)證碼填充到文本框中
開始制作
1.)申請短信權(quán)限
?
????
注意>鼓伞!疚鲤!
由于Google在Android6.0引入了運(yùn)行時(shí)權(quán)限锥累,使得只要API版本大于23的都需要進(jìn)行權(quán)限的申請,在這里推薦使用一個(gè)非常簡單快速的第三方庫來進(jìn)行運(yùn)行時(shí)權(quán)限的申請集歇,Android 6.0運(yùn)行時(shí)權(quán)限第三方庫的使用—–RxPermissions
2.)注冊短信接收者
我們知道桶略,每當(dāng)系統(tǒng)接收到一條短信便會(huì)發(fā)出一條廣播,?
為此,我們首先需要做的就是配置一個(gè)廣播接收者來響應(yīng)這條廣播
AndroidManifest.xml文件中配置短信接受者:
??????
???????????
注意設(shè)置此廣播接收者的級別為最高(1000)
SMSReceiver.java
public?class?SMSReceiver?extends?BroadcastReceiver?{
????private?static?final?String?TAG?=?"SMSReceiver";
????@Override
????public?void?onReceive(Context?context,?Intent?intent)?{
????????//進(jìn)行獲取短信的操作
????????getMsg(context,?intent);
????}
}
3.)接下來進(jìn)行短信內(nèi)容的獲取
private?void?getMsg(Context?context,?Intent?intent)?{
????????//pdus短信單位pdu
????????//解析短信內(nèi)容
????????Object[]?pdus?=?(Object[])?intent.getExtras().get("pdus");
????????assert?pdus?!=?null;
????????for?(Object?pdu?:?pdus)?{
????????????//封裝短信參數(shù)的對象
????????????SmsMessage?sms?=?SmsMessage.createFromPdu((byte[])?pdu);
????????????String?number?=?sms.getOriginatingAddress();
????????????String?body?=?sms.getMessageBody();
????????????//寫自己的處理邏輯
????????????//獲取短信驗(yàn)證碼
????????????getCode(context,?body);
????????}
????}
通過SmsMessage對象可以得到短信的發(fā)送號碼诲宇,短信內(nèi)容及相關(guān)信息际歼。
匹配出驗(yàn)證碼并復(fù)制到剪貼板
這里我們就把驗(yàn)證碼放到剪切板了,當(dāng)然你也可以直接把它填充到文本框中
private?void?getCode(Context?context,?String?body)?{
????????//獲取剪貼板管理器:
????????ClipboardManager?cm?=?(ClipboardManager)?context.getSystemService(Context.CLIPBOARD_SERVICE);
????????Pattern?pattern1?=?Pattern.compile("(\\d{6})");//提取六位數(shù)字
????????Matcher?matcher1?=?pattern1.matcher(body);//進(jìn)行匹配
????????Pattern?pattern2?=?Pattern.compile("(\\d{4})");//提取四位數(shù)字
????????Matcher?matcher2?=?pattern2.matcher(body);//進(jìn)行匹配
????????if?(matcher1.find())?{//匹配成功
????????????String?code?=?matcher1.group(0);
????????????//?創(chuàng)建普通字符型ClipData
????????????ClipData?mClipData?=?ClipData.newPlainText("Label",?code);
????????????//?將ClipData內(nèi)容放到系統(tǒng)剪貼板里姑蓝。
????????????cm.setPrimaryClip(mClipData);
????????????Toast.makeText(context,?"驗(yàn)證碼復(fù)制成功",?Toast.LENGTH_SHORT).show();
????????????Log.d(TAG,?"onReceive:?"?+?code);
????????}?else?if?(matcher2.find())?{
????????????String?code?=?matcher2.group(0);
????????????//?創(chuàng)建普通字符型ClipData
????????????ClipData?mClipData?=?ClipData.newPlainText("Label",?code);
????????????//?將ClipData內(nèi)容放到系統(tǒng)剪貼板里鹅心。
????????????cm.setPrimaryClip(mClipData);
????????????Toast.makeText(context,?"驗(yàn)證碼復(fù)制成功",?Toast.LENGTH_SHORT).show();
????????????Log.d(TAG,?"onReceive:?"?+?code);
????????}?else?{
????????????Toast.makeText(context,?"未檢測到驗(yàn)證碼",?Toast.LENGTH_SHORT).show();
????????????Log.d(TAG,?"onReceive:?"?+?"未檢測到驗(yàn)證碼");
????????}
????}
在這里通過正則表達(dá)式匹配出短信內(nèi)容中的驗(yàn)證碼,因?yàn)轵?yàn)證碼大多數(shù)為4位或者6位纺荧,所以在這里為了簡化就直接進(jìn)行了4位驗(yàn)證碼和6位驗(yàn)證碼的判斷?
ok旭愧,大功告成.