Androidアプリはメール認証コードを取得し、自動的に入力します.

3177 ワード

実現方式の構想:
1、システムにはContentObserverがあり、onChange(boolean selfChange,Uri uri)でメールをフィルタ処理できる.
2、getContentResolver()を呼び出す必要があります.registerContentObserver(uri,true,mObserver)は、登録後にリスニングできます(ContentObserverが有効になります)
実装手順:Activityで現在実装中
1、システムメールurl:Uri uri=Uri.parse("content://sms")
2、ここでContentObserverを継承し、SmsObserverクラスのメールを再処理することができます.
3、内容観察オブジェクトを作成する:SmsObserver mObserver=new SmsObserver(this,mHandler,MSG_RECEIVED_CODE);ここではHnaderを用いて受信検証コードを処理するだけで、EventBusなどを用いて処理メッセージングを行ってもよい
4、getContentResolver()を登録する.registerContentObserver(uri, true, mObserver)
5、opause()またはonDestroy()にgetContentResolver()を逆登録する.unregisterContentObserver(mObserver)
実装されたキーソース:



1、Activity
private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == MSG_RECEIVED_CODE) {
            String code = (String) msg.obj;
            mEtUserVerificationCode.setText(code);
        }
    }
};
mObserver = new SmsObserver(this, mHandler, MSG_RECEIVED_CODE);
Uri uri = Uri.parse("content://sms");
getContentResolver().registerContentObserver(uri, true, mObserver);

2、SmsObserver類
public class SmsObserver extends ContentObserver {

    private Context mContext;
    private Handler mHandler;
    private int mReceivedCode = 1;

    public SmsObserver(Context context, Handler handler, int received_code) {
        super(handler);
        mContext = context;
        mHandler = handler;
        mReceivedCode = received_code;
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        String code = "";
        if (uri.toString().equals("content://sms/raw")) {
            return;
        }
        Uri inboxUri = Uri.parse("content://sms/inbox");
        Cursor c = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");
        if (c != null) {
            if (c.moveToFirst()) {
                String address = c.getString(c.getColumnIndex("address"));
                String body = c.getString(c.getColumnIndex("body"));

                LogUtils.e("    :" + address + "》》》》     :" + body);
                Pattern pattern = Pattern.compile("(\\d{4,6})");
                Matcher matcher = pattern.matcher(body);
                if (matcher.find()) {
                    code = matcher.group(0);
                    LogUtils.e("   》》》" + code);
                    ClipboardManager cmb = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
                    cmb.setText(code);

                    mHandler.obtainMessage(mReceivedCode, code).sendToTarget();
                }

            }
            c.close();
        }

    }
}

 
参照先:https://blog.csdn.net/qq_31939617/article/details/77430688