Android實(shí)現(xiàn)自動填充短信驗(yàn)證碼功能
前言
短信驗(yàn)證碼獲取并自動填寫現(xiàn)在已經(jīng)成為一個人性化App的標(biāo)配了,這篇文章將實(shí)現(xiàn)一個短信驗(yàn)證碼獲取并自動填寫的demo。其實(shí)就是讀取指定號碼的短信并提取出驗(yàn)證碼,然后賦值給EditText顯示。
demo效果圖:

讀取短信
Android系統(tǒng)在接受到一條短信的時候會發(fā)出一條Action為android.provider.Telephony.SMS_RECEIVED的有序廣播,因此我們讀取短信的驗(yàn)證碼只需要監(jiān)聽這個廣播然后提取出短信中的驗(yàn)證碼即可,如:
/**
* Created by 程龍 on 2018/9/27.
*/
public class SMSBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "SMSBroadcastReceiver";
private OnReceiveSMSListener mOnReceiveSMSListener;
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for(Object pdu:pdus) {
SmsMessage smsMessage = SmsMessage.createFromPdu((byte [])pdu);
// 短信號碼
String sender = smsMessage.getDisplayOriginatingAddress();
Log.d(TAG,sender+"");
//短信內(nèi)容
String content = smsMessage.getDisplayMessageBody();
// 篩選
if ("短信發(fā)送方號碼".equals(sender) && mOnReceiveSMSListener!= null) {
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(content);
if(matcher.find()) {
mOnReceiveSMSListener.onReceived(matcher.group());
}
abortBroadcast();
}
}
}
}
/**
* 回調(diào)接口
*/
public interface OnReceiveSMSListener {
void onReceived(String message);
}
public void setOnReceiveSMSListener(OnReceiveSMSListener onReceiveSMSListener) {
mOnReceiveSMSListener = onReceiveSMSListener;
}
}
代碼注釋比較清楚,通過SmsMessage對象可以得到短信的發(fā)送號碼,短信內(nèi)容及相關(guān)信息。當(dāng)短信號碼為你要讀取的短信發(fā)送方號碼時用正則表達(dá)式提取出短信內(nèi)容的驗(yàn)證碼,然后通過調(diào)用監(jiān)聽器的回調(diào)方法更新相應(yīng)的UI。這里只需將短信驗(yàn)證發(fā)送方號碼替換成相應(yīng)的號碼即可,如“106903561008710”為騰訊云注冊發(fā)送的短信號碼。
通常,我們只會在注冊或登錄頁面讀取短信驗(yàn)證碼,所以,我們采用動態(tài)注冊廣播的方式注冊這個廣播,如:
// 注冊廣播 IntentFilter intentFilter = new IntentFilter(SMSBroadcastReceiver.SMS_RECEIVED_ACTION); // 設(shè)置優(yōu)先級 intentFilter.setPriority(Integer.MAX_VALUE); registerReceiver(mSMSBroadcastReceiver,intentFilter);
取消注冊
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mSMSBroadcastReceiver);
}
MainActivity.java的代碼為:
public class MainActivity extends AppCompatActivity implements SMSBroadcastReceiver.OnReceiveSMSListener {
private SMSBroadcastReceiver mSMSBroadcastReceiver = new SMSBroadcastReceiver();
private EditText mEt_code;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEt_code = (EditText) findViewById(R.id.et_code);
mSMSBroadcastReceiver.setOnReceiveSMSListener(this);
// 注冊廣播
IntentFilter intentFilter = new IntentFilter(SMSBroadcastReceiver.SMS_RECEIVED_ACTION);
// 設(shè)置優(yōu)先級
intentFilter.setPriority(Integer.MAX_VALUE);
registerReceiver(mSMSBroadcastReceiver,intentFilter);
}
@Override
public void onReceived(String message) {
mEt_code.setText(message+"");
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mSMSBroadcastReceiver);
}
}
這個demo的代碼實(shí)現(xiàn)比較簡單,就是監(jiān)聽廣播,讀取收到的短信,然后過濾篩選出我們要的驗(yàn)證碼短信,再用正則表達(dá)式提取到驗(yàn)證碼設(shè)置給EditText顯示即可。大家下載或者自己編寫這個demo并更改發(fā)送方短信號碼運(yùn)行,然后可以找個注冊網(wǎng)址或是模擬驗(yàn)證碼短信進(jìn)行測試。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)布局動畫和共享動畫的結(jié)合效果
今天給大家?guī)砟軌蛱嵘脩趔w驗(yàn)感的交互動畫,使用起來非常簡單,體驗(yàn)效果非常贊,其中僅使用到布局動畫和共享動畫,文章通過代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以自己動手試一試2023-09-09
Android Selector 按下修改背景和文本顏色的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android Selector 按下修改背景和文本顏色的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼和demo展示給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11
Android解析json數(shù)據(jù)示例代碼(三種方式)
本篇文章主要介紹了Android解析json數(shù)據(jù)示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
Android錄音功能的實(shí)現(xiàn)以及踩坑實(shí)戰(zhàn)記錄
在Android 開發(fā)過程中,有些功能是通用的,或者是多個業(yè)務(wù)方都需要使用的,下面這篇文章主要給大家介紹了關(guān)于Android錄音功能的實(shí)現(xiàn)以及踩坑的相關(guān)資料,需要的朋友可以參考下2022-06-06
Android手機(jī)開發(fā)設(shè)計(jì)之記事本功能
這篇文章主要為大家詳細(xì)介紹了Android手機(jī)開發(fā)設(shè)計(jì)之記事本功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05

