1. 程式人生 > >安卓ContentObserver模式獲取簡訊用正則自動填充驗證碼

安卓ContentObserver模式獲取簡訊用正則自動填充驗證碼

最近做註冊的時候看到很多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" />

demo就不寫了呵呵這裡很清楚也很簡單..不喜勿噴,有錯回帖,轉載必備 尊重作者-yung7086