【android】ContentObserverでメールを傍受して認証コードを取得する
4481 ワード
登録放送の方法でメールを読み取り、認証コードを取得できることは知っていますが、実際には問題があります.メールの放送は秩序ある放送なので、他のアプリケーションが先に放送をキャプチャして伝達を終了すれば、私たちは永遠にこのメールの変化した放送を受け取ることができません.
そこで、ContentObserverを利用してメールを傍受して認証コードを取得するより良い方法を紹介します.
まず紹介的な文字をください.
「ContentObserver」とは、特定のUriによるデータベースの変化を観察(捕捉)することを目的としたコンテンツオブザーバであり、データベース技術におけるTrigger(Trigger)に類似した処理を行い、ContentObserverが観察するUriが変化するとトリガーされる.トリガーは表トリガー、行トリガーに分けられ、それに応じてContentObserverも「表」に分けられる「ContentObserver、「行」ContentObserverは、もちろん、それが傍受しているUri MIME Typeに関連しています.」
シナリオ3のキーコードを次に示します.
1、AndroidManifest.xmlファイルでのメール読み取り権限の構成
2、メールの変化を傍受する類
メールが変化した場合、メールの内容を読み出し、時間の高さから低さに並べ替えます.自分のプロジェクトに必要なメール認証コードのフォーマットマッチング(ここでのマッチング方法はLOW、--|)に基づいています.見つけたら、メールを読み続けずに直接breakすることができます.ここではHandlerによるUIの更新を行います.
3、登録/登録解除リスニング
通常はonResumでメール傍受を登録し、onStopで登録をキャンセルします.
注意、私たちは受信ボックス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
そこで、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