自动获取短信验证码

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

项目需要,我在网上查了些资料,把自动获取短信验证码的功能实现了,自己记性不好,写此博客以便日后查询

第一种实现方式,用监听广播的形式实现(此方法兼容性不好,有部分手机不能自动填充)

首先实现一个广播监听器

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;
	}
}
需要添加权限

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
    <uses-permission android:name="android.permission.READ_SMS"/>
在需要监听的地方注册监听器

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);
	}
}


第二种实现方式,通过观察短信数据的变化实现

首先实现一个观察者类

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);
    }
}

需要添加权限

    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
    <uses-permission android:name="android.permission.READ_SMS"/>
需要自动填充的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);//填充验证码
    					}
    				}
                }
        	} 
        } 
    };
}

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值