首页 > 程序开发 > 移动开发 > Android >

Android ContentObserver实现验证码自动填入

2017-02-17

在这里跟大家分享下Android的内容监听者 ContentObserver 内容监听者是监听一个指定路径里面的数据,当发生改变的时候会调用onChange方法,在这里跟大家实现一个验证码的自动填写。

在这里跟大家分享下Android的内容监听者 ContentObserver 内容监听者是监听一个指定路径里面的数据,当发生改变的时候会调用onChange方法,在这里跟大家实现一个验证码的自动填写。

布局代码就一个TextView用来显示验证码。

MainActivity中代码如下:

  private TextView textView;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //要赋值的TextView
        textView = (TextView) findViewById(R.id.tv_main_number);
        //实例化一个handler
        handler = new Handler(){
            //接受消息的方法
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //通过Message 获取bundle  bundle是一个放数据的
                Bundle bundle=msg.getData();
                //重bundle中拿出放入相对应key的value
                textView.setText(bundle.getString("number"));

            }
        };
        //开始监听内容 sms为所有短信包括发短信箱,收短信箱,草稿箱...
        this.getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new MyObserver(handler));
    }
//自己用内部类实现CotentObserver 需要重写构造方法
    class MyObserver extends ContentObserver{

        public MyObserver(Handler handler) {
            super(handler);

        }
    //当监听的sms中发生了改变的时候会调用该方法,比如来短信了。
        @Override
        public void onChange(boolean selfChange) {
            //查询收信箱中所有的消息按时间排序
            Cursor cursor=MainActivity.this.getContentResolver().query(Uri.parse("content://sms/inbox"),null,null,null,"date desc");
            //判断游标是否为空
            if(cursor!=null) {
                //如果游标有值,这时的游标查询出来的数据是最新来的短信
               if (cursor.moveToNext()) {
                   //如果收到的短信号码为*******并且内容包含了验证码三个字那么就是想要的
                   if (cursor.getString(cursor.getColumnIndex("address")).equals("+86***********") && cursor.getString(cursor.getColumnIndex("body")).contains("验证码")) {
                    //获取刚才的短信内容
                       String date = cursor.getString(cursor.getColumnIndex("body"));
                       //获取:的开始坐标
                       int star = date.indexOf(":");
                       //在:的坐标基础上+1截取后面四位数
                       String data = date.substring(star + 1, star + 5);
                       //实例化消息
                       Message ms = new Message();
                       //实例化箱子
                       Bundle bundle = new Bundle();
                       //放入验证码到箱子里
                       bundle.putString("number", data);
                       //把箱子放入消息中
                       ms.setData(bundle);
                       //发送消息,通过handler去更新
                       handler.sendMessage(ms);
                   }
               }

           }
        }
    }

所有解释都在代码注释上,注意要增加短信的权限。

今天的分享都在这里了,根据需求可更改判断的条件和判断短信的内容。

相关文章
最新文章
热点推荐