android短信验证码自动填充

来源:互联网 发布:网页游戏网络加速器 编辑:程序博客网 时间:2024/05/21 22:35

项目登录注册,修改密码,或者支付时候经常会通过验证码方式,现在主流的APP也都会通过java代码来自动获取短信中的验证码并且填充到界面上------这样无疑给用户提供更为便捷的操作。

这里参考一些相关的文章我们自己创建一个广播接收器,用户接收短信变化,如果符合我们要求,那么将提取短信中的验证码来显示到界面上。

public class SmsReceiveBroadcastReceiver extends BroadcastReceiver{    private Context context;    private Handler handler;    private int codeLength = 0;//验证码的位数    public SmsReceiveBroadcastReceiver(Context context, Handler handler, int codeLength) {        this.context = context;        this.handler = handler;        this.codeLength = codeLength;    }    @Override    public void onReceive(Context context, Intent intent) {            Bundle bundle = intent.getExtras();        Object[] objects = (Object[]) bundle.get("pdus");        if (objects != null) {            String phone = null;            StringBuffer content = new StringBuffer();            for (int i = 0; i < objects.length; i++) {                SmsMessage sms = SmsMessage.createFromPdu((byte[]) objects[i]);                phone = sms.getDisplayOriginatingAddress();                content.append(sms.getDisplayMessageBody());            }            Log.e("smsbc", "phone:" + phone + "\ncontent:" + content.toString());            checkCodeAndSend(content.toString());        }    }    /**     * @param content     */    private void checkCodeAndSend(String content) {        // 如果我们的短信提供商的短信号码是固定的话.前面可以加一个判断        // 正则表达式验证是否含有验证码        Pattern pattern = Pattern.compile("\\d{" + codeLength + "}");// compile的是规则        Matcher matcher = pattern.matcher(content);// matcher的是内容        if (matcher.find()) {            String code = matcher.group(0);            Log.e("smsbc", "符合规则的验证码:" + code);            handler.obtainMessage(MainActivity.CODE, code).sendToTarget();            Log.e("smsbc", "收到短信的时间:" + System.currentTimeMillis());        } else {            Log.e("smsbc", "么有符合规则的验证码");        }    }}
主页面中使用

public class MainActivity extends Activity{    public static final int CODE=6666;    SmsReceiveBroadcastReceiver broadcastReceiver;    private Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            if (msg.what == CODE) {                String code = (String) msg.obj;                etCode.setText(code);                Log.e("mainactivity", "界面收到短信的时间:" + System.currentTimeMillis());            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        broadcastReceiver = new SmsReceiveBroadcastReceiver(MainActivity.this, handler, 4);        IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");        registerReceiver(broadcastReceiver, intentFilter);    }   //当前页面销毁时取消注册    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(broadcastReceiver);    }}对于时间可以使用SimpleDateFormat来格式化成自己想要的样式此外权限是必不可少的<uses-permission android:name="android.permission.RECEIVE_SMS"/>//获取短信内容<uses-permission android:name="android.permission.GET_ACCOUNTS"/><uses-permission android:name="android.permission.READ_PROFILE"/><uses-permission android:name="android.permission.READ_CONTACTS"/>注意:如果手机是6.0以上的系统话要注意动态权限处理(不要忘记哦)当然也可以将targetSdkVersion改为<23也是可以的


当然还有利用观察者来实现的,但通过此种方式是直接通过源头来实现的,因此效率会高一些

demo下载

0 0