Android實(shí)現(xiàn)自動(dòng)填充短信驗(yàn)證碼功能
前言
短信驗(yàn)證碼獲取并自動(dòng)填寫(xiě)現(xiàn)在已經(jīng)成為一個(gè)人性化App的標(biāo)配了,這篇文章將實(shí)現(xiàn)一個(gè)短信驗(yàn)證碼獲取并自動(dòng)填寫(xiě)的demo。其實(shí)就是讀取指定號(hào)碼的短信并提取出驗(yàn)證碼,然后賦值給EditText顯示。
demo效果圖:
讀取短信
Android系統(tǒng)在接受到一條短信的時(shí)候會(huì)發(fā)出一條Action為android.provider.Telephony.SMS_RECEIVED的有序廣播,因此我們讀取短信的驗(yàn)證碼只需要監(jiān)聽(tīng)這個(gè)廣播然后提取出短信中的驗(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); // 短信號(hào)碼 String sender = smsMessage.getDisplayOriginatingAddress(); Log.d(TAG,sender+""); //短信內(nèi)容 String content = smsMessage.getDisplayMessageBody(); // 篩選 if ("短信發(fā)送方號(hào)碼".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; } }
代碼注釋比較清楚,通過(guò)SmsMessage對(duì)象可以得到短信的發(fā)送號(hào)碼,短信內(nèi)容及相關(guān)信息。當(dāng)短信號(hào)碼為你要讀取的短信發(fā)送方號(hào)碼時(shí)用正則表達(dá)式提取出短信內(nèi)容的驗(yàn)證碼,然后通過(guò)調(diào)用監(jiān)聽(tīng)器的回調(diào)方法更新相應(yīng)的UI。這里只需將短信驗(yàn)證發(fā)送方號(hào)碼替換成相應(yīng)的號(hào)碼即可,如“106903561008710”為騰訊云注冊(cè)發(fā)送的短信號(hào)碼。
通常,我們只會(huì)在注冊(cè)或登錄頁(yè)面讀取短信驗(yàn)證碼,所以,我們采用動(dòng)態(tài)注冊(cè)廣播的方式注冊(cè)這個(gè)廣播,如:
// 注冊(cè)廣播 IntentFilter intentFilter = new IntentFilter(SMSBroadcastReceiver.SMS_RECEIVED_ACTION); // 設(shè)置優(yōu)先級(jí) intentFilter.setPriority(Integer.MAX_VALUE); registerReceiver(mSMSBroadcastReceiver,intentFilter);
取消注冊(cè)
@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); // 注冊(cè)廣播 IntentFilter intentFilter = new IntentFilter(SMSBroadcastReceiver.SMS_RECEIVED_ACTION); // 設(shè)置優(yōu)先級(jí) 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); } }
這個(gè)demo的代碼實(shí)現(xiàn)比較簡(jiǎn)單,就是監(jiān)聽(tīng)廣播,讀取收到的短信,然后過(guò)濾篩選出我們要的驗(yàn)證碼短信,再用正則表達(dá)式提取到驗(yàn)證碼設(shè)置給EditText顯示即可。大家下載或者自己編寫(xiě)這個(gè)demo并更改發(fā)送方短信號(hào)碼運(yùn)行,然后可以找個(gè)注冊(cè)網(wǎng)址或是模擬驗(yàn)證碼短信進(jìn)行測(cè)試。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 開(kāi)發(fā)與代碼無(wú)關(guān)技巧詳解
這篇文章主要為大家介紹了Android 開(kāi)發(fā)與代碼無(wú)關(guān)技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12如何使用Mock修改Android設(shè)備上的features
這篇文章主要介紹了如何使用Mock修改Android設(shè)備上的features,想了解Mock的同學(xué)可以參考下2021-04-04Android 截取手機(jī)屏幕兩種實(shí)現(xiàn)方法
這篇文章主要介紹了Android 截取手機(jī)屏幕兩種實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-05-05詳解Android App中創(chuàng)建ViewPager組件的方法
這篇文章主要介紹了詳解Android App中創(chuàng)建ViewPager組件的方法,ViewPager最基本的功能就是可以使視圖滑動(dòng),需要的朋友可以參考下2016-03-03flutter FadeTransition實(shí)現(xiàn)透明度漸變動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了flutter FadeTransition實(shí)現(xiàn)透明度漸變動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07基于Flutter實(shí)現(xiàn)按位置大小比例布局的控件
做視頻監(jiān)控項(xiàng)目時(shí)需要需要展示多分屏,比如2x2、3x3、414等等,所以本文為大家介紹了如何基于Flutter實(shí)現(xiàn)按位置大小比例布局的控件,需要的可以參考一下2023-08-08Android中懸浮窗口的實(shí)現(xiàn)原理實(shí)例分析
這篇文章主要介紹了Android中懸浮窗口的實(shí)現(xiàn)原理,以實(shí)例形式較為詳細(xì)的分析了Android懸浮窗口的原理與具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Android Studio實(shí)現(xiàn)QQ的注冊(cè)登錄和好友列表跳轉(zhuǎn)
最近做了一個(gè)項(xiàng)目,這篇文章主要介紹了Android Studio界面跳轉(zhuǎn),本次項(xiàng)目主要包含了注冊(cè)、登錄和好友列表三個(gè)界面以及之間相互跳轉(zhuǎn),感興趣的可以了解一下2021-05-05Android仿淘口令復(fù)制彈出框功能(簡(jiǎn)答版)
這篇文章主要介紹了Android仿淘口令復(fù)制彈出框功能(簡(jiǎn)答版)的相關(guān)資料,在文章給大家提到了淘口令原理介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11使用android studio開(kāi)發(fā)工具編譯GBK轉(zhuǎn)換三方庫(kù)iconv的方法
這篇文章主要介紹了使用android studio開(kāi)發(fā)工具編譯GBK轉(zhuǎn)換三方庫(kù)iconv的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06