Android自動入力メール認証コード


現在、メール認証コードを使用するappが多すぎるため、メールをブロックし、その中の認証コードをEditTextに直接取り出す必要があります.通常、次の2つのシナリオがあります.
1、カスタムブロッキングを使ってメールの内容をブロックする.この方式は言うまでもない.
2、メールデータベースの変化を監視する.
実際の応用では,第1の不確定要素が多すぎて,第2のスキームを採用するとより信頼できる.
コードは次のとおりです.
/**
 * @ClassName: SmsObserver
 * @Description:     
 * @author God
 * @date 2015-6-25   5:28:24
 * 
 */
public class SmsObserver extends ContentObserver {
	public static final String SMS_URI_INBOX = "content://sms/inbox";
	private Activity activity = null;
	private String smsContent = "";
	private SmsListener listener;

	public SmsObserver(Activity activity, Handler handler, SmsListener listener) {
		super(handler);
		this.activity = activity;
		this.listener = listener;
}

	@Override
	public void onChange(boolean selfChange) {
		super.onChange(selfChange);
		Cursor cursor = null;
		//                
		ContentResolver contentResolver = activity.getContentResolver();
		cursor = contentResolver.query(Uri.parse(SMS_URI_INBOX), new String[] {
				"_id", "address", "body", "read" }, "body like ? and read=?",
				new String[] { "%  %", "0" }, "date desc");
		if (cursor != null) {
			cursor.moveToFirst();
			if (cursor.moveToFirst()) {
				String smsbody = cursor
						.getString(cursor.getColumnIndex("body"));
				String regEx = "[^0-9]";
				Pattern p = Pattern.compile(regEx);
				Matcher m = p.matcher(smsbody.toString());
				smsContent = m.replaceAll("").trim().toString();
				if (!TextUtils.isEmpty(smsContent)) {
					listener.onResult(smsContent);
				}

			}
		}
	}

	/*
	 *       
	 */
	public interface SmsListener {
		/**
		 *   sms  
		 * 
		 * @Title: onResult
		 */
		void onResult(String smsContent);
	}
}

次のように使用します.
	SmsObserver smsObserver = new SmsObserver(this, new Handler(),
				new SmsListener() {
					@Override
					public void onResult(String smsContent) {
						//todo
					}
				});
		this.getContentResolver().registerContentObserver(
				Uri.parse("content://sms/"), true, smsObserver);