android--监听短信实现短信验证码自动填充

          短信验证已经成为当下手机应用的一项必备功能,为了提高用户体验,验证码自动填充功能应运而生,下面就此功能提供实现方法。


1、建立短信接收的广播接收者:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by Sunwork on 2016/7/8.
 */
public class SMSBroadcastReceiver extends BroadcastReceiver {

	private static final String TAG = "SMSBroadcastReceiver";

	private static MessageListener mMessageListener;

	public SMSBroadcastReceiver() {
		super();
	}

	@Override
	public void onReceive(Context context, Intent intent) {
		Object[] pdus = (Object[]) intent.getExtras().get("pdus");
		for (Object pdu : pdus) {
			SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
			String sender = smsMessage.getDisplayOriginatingAddress();
			String content = smsMessage.getMessageBody();
			long date = smsMessage.getTimestampMillis();
			Date timeDate = new Date(date);
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String time = simpleDateFormat.format(timeDate);

			Log.i(TAG, "onReceive: 短信来自:" + sender);
			Log.i(TAG, "onReceive: 短信内容:" + content);
			Log.i(TAG, "onReceive: 短信时间:" + time);

			//如果短信号码来自自己的短信网关号码
			if ("your sender number".equals(sender) && mMessageListener != null) {
				Log.i(TAG, "onReceive: 回调");
				mMessageListener.OnReceived(content);
			}
		}
	}

	// 回调接口
	public interface MessageListener {

		/**
		 * 接收到自己的验证码时回调
		 * @param message 短信内容
		 */
		void OnReceived(String message);
	}

	/**
	 * 设置验证码接收监听
	 * @param messageListener 自己验证码的接受监听,接收到自己验证码时回调
	 */
	public void setOnReceivedMessageListener(MessageListener messageListener) {
		this.mMessageListener = messageListener;
	}
}

SMSBroadcastReceiver继承自BroadcastReceiver,重写了onReceiver()方法,并通过 intent.getExtras().get("pdus")获取短信内容,然后根据自己的短信网关号码过滤出自己的验证码短信,通过接口回调出去。


2、在AndroidManifest.xml文件中配置短信接受者:


            
                
            
        

注意设置此广播接收者的级别为最高(1000),同时不要忘了添加接收和读取短信的权限:



以上便完成了短信的接收和读取功能,下面就是怎样实现截取验证码的功能了。


3、截取验证码:

原理很简单,就是在回去的短信内容中根据一定的规则截取字符串,算法为:

/**
	 * 从字符串中截取连续6位数字组合 ([0-9]{6})截取六位数字 进行前后断言不能出现数字 用于从短信中获取动态密码
	 * @param content 短信内容
	 * @return 截取得到的6位动态密码
	 */
	public String getDynamicPwd(String content) {
		// 此正则表达式验证六位数字的短信验证码
		Pattern pattern = Pattern.compile("(?

4、在需要的地方设置短信接收广播接收者的监听事件,并展示验证码:

public class MainActivity extends Activity {

		private EditText mVerifyCode;
		private SMSBroadcastReceiver mSMSBroadcastReceiver;

		@Override
		protected void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			setContentView(R.layout.activity_verify_code);
			init();
		}

		private void init() {
			mVerifyCode = (EditText) findViewById(R.id.et_verify_code);
			mSMSBroadcastReceiver = new SMSBroadcastReceiver();
			mSMSBroadcastReceiver.setOnReceivedMessageListener(new MessageListener() {
				public void OnReceived(String message) {
					mVerifyCode.setText(getDynamicPwd(message));//截取6位验证码
				}
			});
		}
	}

这样,获取短信验证码自动填充的功能就全部完成了,当然,接收短信这种功能很可能已经被用户禁止了,所以接收验证码的控件应该是可编辑的EditText,而不该是TextView.

你可能感兴趣的:(android)