Android自动获取短信验证码

第一步:短信广播接收器
public class SMSReceiver extends BroadcastReceiver{
    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"; 
    private MessageListener mMessageListener; 
    @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();  
                long date = smsMessage.getTimestampMillis();  
                Date tiemDate = new Date(date);  
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                String time = simpleDateFormat.format(tiemDate);  //短信发送时间
                /*
                 * 在此可以通过发送的号码和发送的内容以及发送时间来筛选要获取的手机号
                 * 一般发送验证码都会带有产品标识,通过标识来获取
                 * 例如:
                 */
                if(content.contains("【手机淘宝】")){
                    mMessageListener.onReceived(content);
                }
//                   abortBroadcast(); //不要加这句,因为获取自动获取手机短信的权限是最大值,如果被我获取到了,那么有的手机的短信箱就会收不到了
                
            }  
        }
	 
    }
  //回调接口  
    public interface MessageListener {  
        public void onReceived(String message);  
    }  
      
    public void setOnReceivedMessageListener(MessageListener messageListener) {  
        this.mMessageListener = messageListener;  
    }  
}
第二步:在清单配置文件中加入访问权限和注册广播接收器
<pre name="code" class="java"><!-- 读取短信验证码 -->
        <receiver android:name="com.example.verifycode.SMSReceiver" android:exported="false">
            <intent-filter android:priority="2147483647">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
       
    </application>
 <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
 

第三步:在activity中写逻辑代码

public class MainActivity extends Activity {
	private SMSReceiver mSMSReceiver;
	private int second = 0;
    private Timer timer=null;
    private TimerTask task=null;
    private String code;
    private TextView getCodeTv;
    private EditText codeEt;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		getCodeTv=(TextView) findViewById(R.id.getCodeTv);
		codeEt=(EditText) findViewById(R.id.codeEt);
		getCodeTv.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//调用获取验证码的接口
				//获取成功之后
				getCodeOnClick();
			}
		});
	}
	 /*
     * 截取短信中的验证码(这里不是取的六位数字,而是取到数字组,然后取组里的一个)
     * 如,你收到的短信:【手机淘宝】:您的验证码是 845938,如需退订请回复0000.
     */
    private String getVerifyCode(String smsContent) {
		Pattern numberPattern = Pattern.compile("[0-9\\.]+");
		Matcher m = numberPattern.matcher(smsContent);
		String verifyCode = "";
		List<String> codes=new ArrayList<String>();
		while (m.find()) {
		    codes.add(m.group());
		}
		if(codes.size()!=0){
		    verifyCode=codes.get(0);
		}
		return verifyCode;
    }
    /*
     * 自动获取短信验证码并且自动填写
     */
    private void getCodeOnClick() {
    	// 生成广播处理
    	mSMSReceiver = new SMSReceiver();
    	// 实例化过滤器并设置要过滤的广播
    	IntentFilter intentFilter = new IntentFilter(
    		SMSReceiver.SMS_RECEIVED_ACTION);
    	intentFilter.setPriority(Integer.MAX_VALUE);
    	// 注册广播
    	registerReceiver(mSMSReceiver, intentFilter);
    	try {
    	    mSMSReceiver
    		.setOnReceivedMessageListener(new SMSReceiver.MessageListener() {
    		    @Override
    		    public void onReceived(String message) {
    			if (message.contains("【***】")) {
    			    code = getVerifyCode( message);
    			}
    			try {
    				if (code != null) {
    				    codeEt.setText(message);
    				}
    			} catch (Exception e) {
    			    // TODO: handle exception
    			}
    		    }
    		});
    	} catch (Exception e) {
    	    // TODO: handle exception
    	}
    	
    	timer = new Timer();
    	// 启动计时器
    	second = 90;
    	task = new TimerTask() {
    	    @Override
    	    public void run() {
    		second--;
    		runOnUiThread(new Runnable() {
    		    @Override
    		    public void run() {
    			getCodeTv.setBackgroundColor(Color.parseColor("#583945"));
    			getCodeTv.setText(second + "秒后获取");
    			getCodeTv.setEnabled(false);
    			if (second <= 0) {
    				getCodeTv
    				.setBackgroundColor(Color.parseColor("#123456"));
    			getCodeTv.setText("获取验证码");
    			getCodeTv.setEnabled(true);
    			if (timer != null) {
    			    timer.cancel();
    			    timer = null;
    			    task = null;
    			}
    			}
    		    }
    		});
    	    }
    	};
    	timer.schedule(task, 20, 1000);
        }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值