Android 短信驗證碼自動填寫

jopen 8年前發布 | 16K 次閱讀 Android開發 移動開發

       這個也不是什么新東西,目前很多app都有這個功能,最近有幾個小伙伴問我是怎么實現的,索性寫一篇博客來為大家解答。

       實現思路很簡單: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安全衛士,把你們公司的驗證碼視為垃圾短信攔截了,這個時候短信攔截就失效了。

來自: http://blog.csdn.net/soul_code/article/details/50337221

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!