Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 中使用ContentObserver模式獲取短信用正則自動填充驗證碼

Android 中使用ContentObserver模式獲取短信用正則自動填充驗證碼

編輯:關於Android編程

最近做注冊的時候看到很多app在手機接受到短信的時候直接填寫驗證碼到界面省略用戶自動輸入,感覺這樣確實蠻人性化的呵呵,於是自己也做了一個

步驟:

首先我使用了ContentObserver監聽短信,(最好知道您的驗證碼從那個號碼發過來)

然後從短信中用正則的分組去拿到驗證碼(當然驗證碼必須是什麼格式)

貼出關鍵代碼:

注冊監聽短信數據庫的 

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", "驗證碼提取失敗:" + 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; 
  } 
    /** 
   * 從短信字符竄提取驗證碼 
   * @param body 短信內容 
     * @param YZMLENGTH 驗證碼的長度 一般6位或者4位 
   * @return 接取出來的驗證碼 
   */ 
  public static String getyzm(String body, int YZMLENGTH) { 
    // 首先([a-zA-Z0-9]{YZMLENGTH})是得到一個連續的六位數字字母組合 
    // (?<![a-zA-Z0-9])負向斷言([0-9]{YZMLENGTH})前面不能有數字 
    // (?![a-zA-Z0-9])斷言([0-9]{YZMLENGTH})後面不能有數字出現 
    Pattern p = Pattern 
        .compile("(?<![a-zA-Z0-9])([a-zA-Z0-9]{" + YZMLENGTH + "})(?![a-zA-Z0-9])"); 
    Matcher m = p.matcher(body); 
    if (m.find()) { 
      System.out.println(m.group()); 
      return m.group(0); 
    } 
    return null; 
  } 
//有些驗證碼是純數字的那麼直接用這個就可以了
//Pattern p = Pattern.compile("(?<![0-9])([0-9]{" + YZMLENGTH+ "})(?![0-9])");

監聽完成後記得getContentResolver().unregisterContentObserver(c);注銷監聽

這樣子就可以監聽到短信數據庫的變化了記住還需要加入權限順便列出短信權限

 <!-- 發送短信-->
  <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" />

 以上所述是小編給大家介紹的Android 中使用ContentObserver模式獲取短信用正則自動填充驗證碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對本站網站的支持!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved