【android】ContentObserverでメールを傍受して認証コードを取得する

4481 ワード

登録放送の方法でメールを読み取り、認証コードを取得できることは知っていますが、実際には問題があります.メールの放送は秩序ある放送なので、他のアプリケーションが先に放送をキャプチャして伝達を終了すれば、私たちは永遠にこのメールの変化した放送を受け取ることができません.
そこで、ContentObserverを利用してメールを傍受して認証コードを取得するより良い方法を紹介します.
まず紹介的な文字をください.
「ContentObserver」とは、特定のUriによるデータベースの変化を観察(捕捉)することを目的としたコンテンツオブザーバであり、データベース技術におけるTrigger(Trigger)に類似した処理を行い、ContentObserverが観察するUriが変化するとトリガーされる.トリガーは表トリガー、行トリガーに分けられ、それに応じてContentObserverも「表」に分けられる「ContentObserver、「行」ContentObserverは、もちろん、それが傍受しているUri MIME Typeに関連しています.」
シナリオ3のキーコードを次に示します.
1、AndroidManifest.xmlファイルでのメール読み取り権限の構成

2、メールの変化を傍受する類
public class SmsContentObserver extends ContentObserver {
		private static final String TAG = "SmsContentObserver";
		//        
		private static final String VERIFY_CODE_FROM = "106903331094102";
		//5       
		private static final String PATTERN_CODER = "(?		private Context mContext;
		private Handler mHandler;


		public SmsContentObserver(Context context, Handler handler) {
			super(handler);
			this.mContext = context;
			this.mHandler = handler;
		}


		@Override
		public void onChange(boolean selfChange) {
			Uri inBoxUri = Uri.parse("content://sms/inbox");
			Cursor c = mContext.getContentResolver().query(inBoxUri, null,
					null, null, "date desc");
			if (c != null) {
//				while (c.moveToNext()) {
				//         
				if (c.moveToNext()) {
					String number = c.getString(c.getColumnIndex("address"));//   
					Log.d(TAG, "number:"+number);
					String body = c.getString(c.getColumnIndex("body"));
					if (number.equals(VERIFY_CODE_FROM)) {
						String verifyCode = patternCode(body);
						Message msg = Message.obtain();
						msg.what = 1;
						msg.obj = verifyCode;
						mHandler.sendMessage(msg);
//						break;
					}
				}
				c.close();
			}
		}
		
		private String patternCode(String patternContent) {
			if (TextUtils.isEmpty(patternContent)) {
				return null;
			}
			Pattern p = Pattern.compile(PATTERN_CODER);
			Matcher matcher = p.matcher(patternContent);
			if (matcher.find()) {
				return matcher.group();
			}
			return null;
		}
	}

メールが変化した場合、メールの内容を読み出し、時間の高さから低さに並べ替えます.自分のプロジェクトに必要なメール認証コードのフォーマットマッチング(ここでのマッチング方法はLOW、--|)に基づいています.見つけたら、メールを読み続けずに直接breakすることができます.ここではHandlerによるUIの更新を行います.
3、登録/登録解除リスニング
通常はonResumでメール傍受を登録し、onStopで登録をキャンセルします.
@Override
protected void onStop() {
    super.onStop();
    unRegisterSmsContentObservers();
}

@Override
protected void onResume() {
    super.onResume();
    registerSmsContentObservers();
}

private void registerSmsContentObservers() {
    Uri smsUri = Uri.parse("content://sms");
   //smsContentObserver SmsContentObserver     ,   onCreate    
   getContentResolver().registerContentObserver(smsUri, true,smsContentObserver);
}

private void unRegisterSmsContentObservers() {   getContentResolver().unregisterContentObserver(smsContentObserver);
}

注意、私たちは受信ボックスinboxを傍受していますが、登録時にすべてのメールの変化を傍受する必要があります.この文は重要です.
Uri.parse("content://sms")

書くことができない
Uri.parse("content://sms/inbox")

実は、ContentObserverを通じていろいろなことができます.もっと多くの機能はみんなが発見するのを待っています.
また、smsの主な構造を添付します:id:メール番号、例えば100 thread_id:会話のシーケンス番号、例えば100、同じ携帯電話番号とやり取りするメール、そのシーケンス番号は同じaddress:送信者アドレス、すなわち携帯電話番号、+8613818000 person:送信者、もし送信者が通信録の中で具体的な名前であれば、見知らぬ人はnull date:日付、long型、例えば1346988516、日付表示フォーマットを設定できますprotocol:プロトコル0 SMS_RPOTOメール、1 MMS_PROTOカラーメッセージread:0未読を読むかどうか、1既読status:メールステータス-1受信、0 complete、64 pending、128 failed type:メールタイプ1受信、2送信body:メール具体内容service_センター:メールサービスセンター番号、例えば+8613807755500
参照先:http://www.jianshu.com/p/5ccdcd9bed89、http://blog.csdn.net/mad1989/article/details/22426415