メール認証コードの自動読み取り機能を実現
4619 ワード
メール認証コードの自動読み取り機能を実現
観察者モードを用いてメールの変化を傍受する
Observerの登録/ログアウト
アテンション権限の宣言
観察者モードを用いてメールの変化を傍受する
/**
*
* @author Jeff
* @describe
* @date 2018/5/24.
*/
public class SmsDatabaseObserver extends ContentObserver {
//
public static final Uri MMSSMS_ALL_MESSAGE_URI = Uri.parse("content://sms/inbox");
public static final String SORT_FIELD_STRING = "_id asc"; //
public static final String DB_FIELD_ID = "_id";
public static final String DB_FIELD_ADDRESS = "address";
public static final String DB_FIELD_PERSON = "person";
public static final String DB_FIELD_BODY = "body";
public static final String DB_FIELD_DATE = "date";
public static final String DB_FIELD_TYPE = "type";
public static final String DB_FIELD_THREAD_ID = "thread_id";
public static final String[] ALL_DB_FIELD_NAME = {
DB_FIELD_ID, DB_FIELD_ADDRESS, DB_FIELD_PERSON, DB_FIELD_BODY,
DB_FIELD_DATE, DB_FIELD_TYPE, DB_FIELD_THREAD_ID };
public static int mMessageCount = -1;
private static final long DELTA_TIME = 60 * 1000;
private ContentResolver mResolver;
private OnSmsDatabaseChangedListener onSmsDatabaseChangedListener;
public SmsDatabaseObserver(ContentResolver resolver, Handler handler) {
super(handler);
mResolver = resolver;
}
@Override
public void onChange(boolean selfChange) {
onReceiveSms();
}
private void onReceiveSms() {
Cursor cursor = null;
//
try {
cursor = mResolver.query(MMSSMS_ALL_MESSAGE_URI, ALL_DB_FIELD_NAME,
null, null, SORT_FIELD_STRING);
final int count = cursor.getCount();
if (count <= mMessageCount) {
mMessageCount = count;
return;
}
// --- ,
// id id--- ,
mMessageCount = count;
if (cursor != null) {
cursor.moveToLast();
final long smsdate = Long.parseLong(cursor.getString(cursor.getColumnIndex(DB_FIELD_DATE)));
final long nowdate = System.currentTimeMillis();
// 60 ,
if (nowdate - smsdate > DELTA_TIME) {
return;
}
final String strAddress = cursor.getString(cursor.getColumnIndex(DB_FIELD_ADDRESS)); //
final String strbody = cursor.getString(cursor.getColumnIndex(DB_FIELD_BODY)); //
final int smsid = cursor.getInt(cursor.getColumnIndex(DB_FIELD_ID));
if (TextUtils.isEmpty(strAddress) || TextUtils.isEmpty(strbody)) {
return;
}
//
if (onSmsDatabaseChangedListener!=null)
onSmsDatabaseChangedListener.onSmsDatabaseChanged(strbody);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
try { // cursor
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void setOnSmsDatabaseChangedListener(OnSmsDatabaseChangedListener onSmsDatabaseChangedListener) {
this.onSmsDatabaseChangedListener = onSmsDatabaseChangedListener;
}
//
public interface OnSmsDatabaseChangedListener{
void onSmsDatabaseChanged(String content);
}
}
Observerの登録/ログアウト
private void registerSmsDatabaseChangeObserver(ContextWrapper contextWrapper) {
// , rom getContentResolver
try {
mSmsDBChangeObserver = new SmsDatabaseObserver(contextWrapper.getContentResolver(), new Handler());
contextWrapper.getContentResolver().registerContentObserver(SMS_MESSAGE_URI, true, mSmsDBChangeObserver);
} catch (Throwable b) {
}
}
private void unregisterSmsDatabaseChangeObserver(ContextWrapper contextWrapper) {
try {
contextWrapper.getContentResolver().unregisterContentObserver(mSmsDBChangeObserver);
} catch (Exception e) {
e.printStackTrace();
}
}
アテンション権限の宣言