メール認証コードの自動取得

5578 ワード

プロジェクトの需要、私はネット上でいくつかの資料を調べて、自動的にメールの検証コードの機能を取得することを実現して、自分で記憶力がよくなくて、このブログを書いて後で調べるためです
1つ目の実装方式は,傍受放送の形式で実現する(この方法は互換性が悪く,一部の携帯電話では自動的に充填できない)
まず、ブロードキャストリスナーを実装します.
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
/**
 *     
 * @author
 */
public class SMSReceiver extends BroadcastReceiver {
	private static MessageListener mMessageListener;
	public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {
			Object[] pdus = (Object[]) intent.getExtras().get("pdus");
			for (Object pdu : pdus) {
				SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
				//String sender = smsMessage.getDisplayOriginatingAddress();//   
				String content = smsMessage.getDisplayMessageBody();//     
				//             :"【XXXX】         ,   :539611(        ,          )"
				if( content.indexOf("XXXX") != -1){//       XXXX  
					int index = content.indexOf("   :");
					index += 4;
					mMessageListener.onReceived( content.substring( index,  index+6 ) );
					//abortBroadcast();//    
				}
			}
		}
	}
	//     
	public interface MessageListener {
		public void onReceived(String message);
	}
	public void setOnReceivedMessageListener(MessageListener messageListener) {
		this.mMessageListener = messageListener;
	}
}

権限を追加する必要があります.

    

リスニングが必要な場所にリスナーを登録するには、次の手順に従います.
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.EditText;

public class MainActivity extends Activity {
	EditText et;
	private SMSReceiver mSMSReceiver;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		et = (EditText) findViewById(R.id.editText1);
		//       
		mSMSReceiver = new SMSReceiver();
		//                
		IntentFilter intentFilter = new IntentFilter(SMSReceiver.SMS_RECEIVED_ACTION);
		intentFilter.setPriority(Integer.MAX_VALUE);
		//     
		this.registerReceiver(mSMSReceiver, intentFilter);
		mSMSReceiver.setOnReceivedMessageListener(new SMSReceiver.MessageListener() {
			@Override
			public void onReceived(String message) {
				et.setText(message);
			}
		});
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		//         
		this.unregisterReceiver(mSMSReceiver);
	}
}

第2の実現方式は、メールデータの変化を観察することによって実現される
まず観察者クラスを実現します
public class SmsObserver extends ContentObserver {
	Handler handler = null;
    public SmsObserver(Context context, Handler handler) {
        super(handler);
        this.handler = handler;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        //     ,      activity
        Message message = handler.obtainMessage();  
        message.arg1 = Contants.SMS_HANDLER_MSG; 
        handler.sendMessage(message);
    }
}

権限を追加する必要があります.
    
    

自動充填が必要なactivity
public class MainActivity extends Activity {
	EditText et;
	/**       */
	private SmsObserver smsObserver = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		et = (EditText) findViewById(R.id.editText1);
		smsObserver = new SmsObserver(getApplicationContext(),smsHandler);
		//  SmsObserver
		getContentResolver().registerContentObserver(SMS_INBOX, true, smsObserver);
		
	}
	private Uri SMS_INBOX = Uri.parse("content://sms/");
	/**                      */
	public Handler smsHandler = new Handler() {
        public void handleMessage(Message msg) { 
        	//Contants.SMS_HANDLER_MSG            
        	if( msg.arg1 == Contants.SMS_HANDLER_MSG ){
        		ContentResolver cr = getContentResolver();
                String[] projection = new String[] { "body","address","person"};// "_id", "address",
                                                                // "person",, "date",// "type
                String where = " date >  "+ (System.currentTimeMillis() - 10 * 60 * 1000);
                Cursor cur = cr.query( SMS_INBOX, projection, where, null, "date desc");
                if (null == cur){ return;}     
                if (cur.moveToNext()) {
                    String body = cur.getString(cur.getColumnIndex("body"));
                    if( body.indexOf("XXXX") != -1){//       XXXX  ,           
    					int index = body.indexOf("   :");
    					index += 4;
    					String message = body.substring( index,  index+6 );
    					//           ,                          
    					Pattern pattern = Pattern.compile("[0-9]{6}");
    					Matcher matcher = pattern.matcher(message);
    					if (matcher.find()) {
    						et.setText(message);//     
    					}
    				}
                }
        	} 
        } 
    };
}