android 截取驗證碼的兩種實現方式

來源:互聯網
上載者:User

標籤:android   驗證碼   address   equals   public   

在進行手機驗證碼驗證時,為了提升使用者體驗,實現自動截取驗證填充的行式,實現這個功能有兩種方法,分別是利用android的廣播機制和android的ContentObserver 實現。

    第一種的實現方法如下: 

/**
  * 監聽返回的驗證碼資訊,並自動補充如驗證碼輸入框中 [一級方法]
  */
 public BroadcastReceiver getMessageReceive = new BroadcastReceiver() {
  String address;

  @Override
  public void onReceive(Context context, Intent intent) {
   Log.v(TAG+"--BroadcastReceiver --", "進入onReceive");
   String msgCode = null;
   if (intent.getAction().equals(
     "android.provider.Telephony.SMS_RECEIVED")) {
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
     Object[] pdus = (Object[]) intent.getExtras().get("pdus");
     for (Object pdu : pdus) {
      SmsMessage message = SmsMessage
        .createFromPdu((byte[]) pdu);
      // 擷取簡訊的本文內容
      content = message.getMessageBody().trim();
      // 擷取簡訊的寄件者
      address = message.getOriginatingAddress();
     }
     Log.v(TAG+"BroadcastReceiver address", "手機號=="
       + address);
     if (address != null && address.equals("10658464")) {
      String regex = "\\d*";
      Pattern p = Pattern.compile(regex);
      Matcher m = p.matcher(content);
      while (m.find()) {
       if (m.group().length() == 6) {
        msgCode = m.group();
       }
      }
      Log.v(TAG+" BroadcastReceiver msgCode",
        "驗證碼==" + msgCode);
      metVerify.setText(msgCode);
     }
    }
   }
  }

 }; 

在activity 中的oncreate方法中,需要註冊這個廣播:

 filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 
  getApplicationContext().registerReceiver(getMessageReceive, filter);

這樣,在接收到簡訊後,會發送廣播,然後進行截取,但這個方法在android4.4後,部分手機就無法正常截取,因此推薦使用第二個方法。

  第二個方法實現如下:

/**
     * 監聽簡訊資料庫
     */
    class SmsContent extends ContentObserver {

        private Cursor cursor = null;

        public SmsContent(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {

            super.onChange(selfChange);
            //讀取收件匣中指定號碼的簡訊
            cursor = managedQuery(Uri.parse("content://sms/inbox"), new String[]{"_id", "address", "read", "body"},
                    " address=? and read=?", new String[]{"10658464", "0"}, "_id desc");//按id排序,如果按date排序的話,修改手機時間後,讀取的簡訊就不準了
            if (cursor != null && cursor.getCount() > 0) {
                ContentValues values = new ContentValues();
                values.put("read", "1");        //修改簡訊為已讀模式
                cursor.moveToNext();
                int smsbodyColumn = cursor.getColumnIndex("body");
                String smsBody = cursor.getString(smsbodyColumn);
                ed_mmscode.setText(getDynamicPassword(smsBody));

            }

            //在用managedQuery的時候,不能主動調用close()方法, 否則在Android 4.0+的系統上, 會發生崩潰
            if(Build.VERSION.SDK_INT < 14) {
                cursor.close();
            }
        }
    }

種用內容觀查者,在接收到簡訊後,發生變化時,觸發onChange 方法。這種方法在測試的手機上均可攔截,故推薦大家使用這種方法,附demo 下載 :https://github.com/maliankun/intercept/archive/master.zip

android 截取驗證碼的兩種實現方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.