Android 中使用ContentObserver模式獲取短信用正則自動填充驗證碼
最近做注冊的時候看到很多app在手機接受到短信的時候直接填寫驗證碼到界面省略用戶自動輸入,感覺這樣確實蠻人性化的呵呵,于是自己也做了一個
步驟:
首先我使用了ContentObserver監(jiān)聽短信,(最好知道您的驗證碼從那個號碼發(fā)過來)
然后從短信中用正則的分組去拿到驗證碼(當然驗證碼必須是什么格式)
貼出關(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", "驗證碼提取失敗:" + 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 短信內(nèi)容 * @param YZMLENGTH 驗證碼的長度 一般6位或者4位 * @return 接取出來的驗證碼 */ public static String getyzm(String body, int YZMLENGTH) { // 首先([a-zA-Z0-9]{YZMLENGTH})是得到一個連續(xù)的六位數(shù)字字母組合 // (?<![a-zA-Z0-9])負向斷言([0-9]{YZMLENGTH})前面不能有數(shù)字 // (?![a-zA-Z0-9])斷言([0-9]{YZMLENGTH})后面不能有數(shù)字出現(xiàn) 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; } //有些驗證碼是純數(shù)字的那么直接用這個就可以了 //Pattern p = Pattern.compile("(?<![0-9])([0-9]{" + YZMLENGTH+ "})(?![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" />
以上所述是小編給大家介紹的Android 中使用ContentObserver模式獲取短信用正則自動填充驗證碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android通過原生APi獲取所在位置的經(jīng)緯度
本篇文章主要介紹了Android通過原生APi獲取所在位置的經(jīng)緯度,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07Android viewpage實現(xiàn)禁止滑動的功能
這篇文章主要介紹了Android viewpage實現(xiàn)禁止滑動的功能的相關(guān)資料,這里附有實現(xiàn)的實例代碼,主要還是重新 ViewPage 這個類,需要的朋友可以參考下2016-11-11Android開發(fā)實現(xiàn)的IntentUtil跳轉(zhuǎn)多功能工具類【包含視頻、音頻、圖片、攝像頭等操作功能】
這篇文章主要介紹了Android開發(fā)實現(xiàn)的IntentUtil跳轉(zhuǎn)多功能工具類,該封裝類還包含視頻、音頻、圖片、攝像頭等操作功能,需要的朋友可以參考下2017-11-11Android調(diào)試出現(xiàn)The selected device is incompatible問題解決
這篇文章主要介紹了Android調(diào)試出現(xiàn)The selected device is incompatible問題解決的相關(guān)資料,需要的朋友可以參考下2017-01-01Android仿微信發(fā)表說說實現(xiàn)拍照、多圖上傳功能
這篇文章主要為大家詳細介紹了Android仿微信發(fā)表說說實現(xiàn)拍照、多圖上傳功能,使用Retrofit2.0技術(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-03-03Android事件分發(fā)機制(下) View的事件處理
這篇文章主要介紹了Android事件分發(fā)機制下篇, View的事件處理的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01