溫馨提示×

溫馨提示×

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

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

在Android 中使用ContentObserver怎么獲取短信驗(yàn)證碼并實(shí)現(xiàn)自動(dòng)填充

發(fā)布時(shí)間:2020-11-21 16:09:45 來源:億速云 閱讀:210 作者:Leah 欄目:移動(dòng)開發(fā)

在Android 中使用ContentObserver怎么獲取短信驗(yàn)證碼并實(shí)現(xiàn)自動(dòng)填充?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

步驟:

首先我使用了ContentObserver監(jiān)聽短信,(最好知道您的驗(yàn)證碼從那個(gè)號碼發(fā)過來)

然后從短信中用正則的分組去拿到驗(yàn)證碼(當(dāng)然驗(yàn)證碼必須是什么格式)

貼出關(guān)鍵代碼:

注冊監(jiān)聽短信數(shù)據(jù)庫的 

ContentObserver c=new ContentObserver(han) { 
        @Override 
        public void onChange(boolean selfChange) {           // TODO Auto-generated method stub 
          super.onChange(selfChange); 
          han.sendEmptyMessage(0); 
        } 
      }; 
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, c); 
Handler han = new Handler() { 
    @SuppressWarnings("deprecation") 
    public void handleMessage(android.os.Message msg) { 
      String codestr = null; 
      try { 
        codestr = Cus_UnitTools.getsmsyzm(Reg_ForgetPassword.this); 
        code.setText(codestr); 
        requestcode(); 
      } catch (Exception e) { 
        Log.e("yung", "驗(yàn)證碼提取失敗:" + codestr); 
      } 
    }; 
  };  
  public static String getsmsyzm(Activity c) { 
    Uri uri = Uri.parse("content://sms/inbox"); 
    String[] projection = new String[] { "address", "person", "body" }; 
    String selection = " address='" + JTPHONE + "' "; 
    String[] selectionArgs = new String[] {}; 
    String sortOrder = "date desc"; 
    @SuppressWarnings("deprecation") 
    Cursor cur = c.managedQuery(uri, projection, selection, selectionArgs, 
        sortOrder); 
    if(cur!=null&&cur.getCount()>0){ 
      cur.moveToFirst(); 
      String body = cur.getString(cur.getColumnIndex("body")).replaceAll( 
          "\n", " "); 
      cur.close(); 
      return getyzm(body, YZMLENGTH); 
  } 
    cur.close(); 
    return null; 
  } 
    /** 
   * 從短信字符竄提取驗(yàn)證碼 
   * @param body 短信內(nèi)容 
     * @param YZMLENGTH 驗(yàn)證碼的長度 一般6位或者4位 
   * @return 接取出來的驗(yàn)證碼 
   */ 
  public static String getyzm(String body, int YZMLENGTH) { 
    // 首先([a-zA-Z0-9]{YZMLENGTH})是得到一個(gè)連續(xù)的六位數(shù)字字母組合 
    // (&#63;<![a-zA-Z0-9])負(fù)向斷言([0-9]{YZMLENGTH})前面不能有數(shù)字 
    // (&#63;![a-zA-Z0-9])斷言([0-9]{YZMLENGTH})后面不能有數(shù)字出現(xiàn) 
    Pattern p = Pattern 
        .compile("(&#63;<![a-zA-Z0-9])([a-zA-Z0-9]{" + YZMLENGTH + "})(&#63;![a-zA-Z0-9])"); 
    Matcher m = p.matcher(body); 
    if (m.find()) { 
      System.out.println(m.group()); 
      return m.group(0); 
    } 
    return null; 
  } 
//有些驗(yàn)證碼是純數(shù)字的那么直接用這個(gè)就可以了
//Pattern p = Pattern.compile("(&#63;<![0-9])([0-9]{" + YZMLENGTH+ "})(&#63;![0-9])");

監(jiān)聽完成后記得getContentResolver().unregisterContentObserver(c);注銷監(jiān)聽

這樣子就可以監(jiān)聽到短信數(shù)據(jù)庫的變化了記住還需要加入權(quán)限順便列出短信權(quán)限

 <!-- 發(fā)送短信-->
  <uses-permission Android:name="android.permission.SEND_SMS" />
  <!-- 閱讀消息 -->
  <uses-permission android:name="android.permission.READ_SMS" />
  <!-- 寫入消息 -->
  <uses-permission android:name="android.permission.WRITE_SMS" />
  <!-- 接收消息 -->
  <uses-permission android:name="android.permission.RECEIVE_SMS" />

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI