团队项目——第一阶段冲刺3
一、前言
1.昨天完成了:
1)简单实现了验证码接收登录
2)优化了标签页布局
2.今天完成了:
短信验证码自动填写功能
3.遇到的问题:
短信监听失败导致无法读取内容
解决方法:使用代码注册广播,同时将优先级调至最大(但仍不能保证一定可以收到短信)
二、设计思路
- 在需要输入验证码的Activity代码注册监听短信的广播
- 拦截短信,获取其中的验证码
- 回写到EditText
三、逻辑代码
private SmsReciver smsReciver = new SmsReciver(); // 收到短信Action String ACTION_SMS_RECIVER = "android.provider.Telephony.SMS_RECEIVED"; /** * 注册广播接受者监听短信验证码自动回写 可在onCreate()中进行注册; */ private void registSmsReciver() { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_SMS_RECIVER); // 设置优先级 不然监听不到短信 filter.setPriority(1000); registerReceiver(smsReciver, filter); } /** * 短信广播接受者 用户监听短信,自动填写验证码 */ private class SmsReciver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Object[] objs = (Object[]) intent.getExtras().get("pdus"); for (Object obj : objs) { yte[] pdu = (byte[]) obj; SmsMessage sms = SmsMessage.createFromPdu(pdu); // 短信的内容 String message = sms.getMessageBody(); Log.d("log", "message " + message); // 短息的手机号,这里可以进行一个号码的校验 String from = sms.getOriginatingAddress(); Log.d("log", "from " + from); analysisVerify(message); } } } /** * 解析短信并且回写 这里解析的是纯数字的短信,如果小伙伴的验证码包含字母的话,可用正则替换 * * @param message */ private void analysisVerify(String message) { char[] msgs = message.toCharArray(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < msgs.length; i++) { if ('0' <= msgs[i] && msgs[i] <= '9') { sb.append(msgs[i]); } } mEtVerifyCode.setText(sb.toString()); } @Override protected void onDestroy() { super.onDestroy(); // 取消短信广播注册 if (smsReciver != null) { unregisterReceiver(smsReciver); smsReciver = null; } }
可以看到代码逻辑比较简单,需要注意的有几点。我们这里用的代码注册广播,之所以不采取全局广播的形式原因有两点,在高版本的api,注册全局的短信监听会失效。而且就业务而言,我们监听短信只会在输入验证码的Activity里面才会用到,采用代码注册的形式,在当前Activity销毁的时候取消广播注册,更符合我们的预期,提高应用的性能。
第二个需要注意的问题是优先级的问题。
filter.setPriority(1000);
我们这里把优先级设置成了最大,保证我们的应用能够尽可能的接受到短信。(注意:不是绝对)