本執行個體為大家分享了Android實現簡訊驗證碼自動填寫功能,供大家參考,具體內容如下
實現思路很簡單:
- 1、在需要輸入驗證碼的Activity代碼註冊監聽簡訊的廣播
- 2、攔截簡訊,擷取其中的驗證碼
- 3、回寫到EditText
private SmsReciver smsReciver = new SmsReciver(); /** 收到簡訊Action **/ String ACTION_SMS_RECIVER = "android.provider.Telephony.SMS_RECEIVED"; /** * 註冊廣播接受者監聽簡訊驗證碼自動回寫 可在onCreate()中進行註冊; */ private void registSmsReciver() { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_SMS_RECIVER); // 設定優先權 不然監聽不到簡訊 filter.setPriority(1000); registerReceiver(smsReciver, filter); } /** * 簡訊廣播接受者 使用者監聽簡訊,自動填寫驗證碼 */ private class SmsReciver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Object[] objs = (Object[]) intent.getExtras().get("pdus"); for (Object obj : objs) { yte[] pdu = (byte[]) obj; SmsMessage sms = SmsMessage.createFromPdu(pdu); // 簡訊的內容 String message = sms.getMessageBody(); Log.d("log", "message " + message); // 短息的手機號,如果你們公司發送驗證碼的號碼是固定的這裡可以進行一個號碼的校正 String from = sms.getOriginatingAddress(); Log.d("log", "from " + from); analysisVerify(message); } } } /** * 解析簡訊並且回寫 這裡解析的是純數位簡訊,如果小夥伴的驗證碼包含字母的話,可用正則替換 * * @param message */ private void analysisVerify(String message) { char[] msgs = message.toCharArray(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < msgs.length; i++) { if ('0' <= msgs[i] && msgs[i] <= '9') { sb.append(msgs[i]); } } mEtVerifyCode.setText(sb.toString()); } @Override protected void onDestroy() { super.onDestroy(); // 取消簡訊廣播註冊 if (smsReciver != null) { unregisterReceiver(smsReciver); smsReciver = null; } }
可以看到代碼邏輯比較簡單,需要注意的有幾點。我們這裡用的代碼註冊廣播,之所以不採取全域廣播的形式原因有兩天,在高版本的api,註冊全域的簡訊監聽會失效。而且就業務而言,我們監聽簡訊只會在輸入驗證碼的Activity裡面才會用到,採用代碼註冊的形式,在當前Activity銷毀的時候取消廣播註冊,更符合我們的預期,提高應用的效能。
第二個需要注意的問題是優先順序的問題。
filter.setPriority(1000);
可以看到,我們這裡把優先順序設定成了最大。保證我們的應用能夠儘可能的接受到簡訊。注意,我使用的是“儘可能”,也就是說我們不能保證簡訊自動填寫一定能執行成功,有個小夥伴可能會問,我們不是把優先順序設定成了最高了嗎?
為什麼還不能保證了?
原因其實很簡單,你能把監聽簡訊的優先順序設定成最大,同樣的,其他的應用也能把簡訊監聽的優先順序設定成最大。比如說,你的手機安裝有360安全衛士,把你們公司的驗證碼視為垃圾簡訊攔截了,這個時候簡訊攔截就失效了。
以上就是本文的全部內容,希望對大家的學習有所協助。