亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-19 12:40:44 來源:網絡 閱讀:4691 作者:manlianman 欄目:移動開發

在進行手機驗證碼驗證時,為了提升用戶體驗,實現自動截取驗證填充的行式,實現這個功能有兩種方法,分別是利用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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴海县| 赞皇县| 昭通市| 长泰县| 县级市| 河北省| 南木林县| 钟祥市| 城口县| 江北区| 永吉县| 柏乡县| 乐山市| 南皮县| 衡山县| 阜康市| 白城市| 阿克陶县| 湖州市| 丹巴县| 浪卡子县| 杭锦后旗| 漯河市| 溆浦县| 会东县| 加查县| 巫溪县| 祁阳县| 双峰县| 呈贡县| 云霄县| 根河市| 家居| 合作市| 得荣县| 潮安县| 南平市| 达日县| 莱阳市| 洱源县| 太仆寺旗|