Android ContentObserver实现验证码自动填入

来源:互联网 发布:程序员的自我修养 pdf 编辑:程序博客网 时间:2024/05/16 02:19

在这里跟大家分享下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);                   }               }           }        }    }

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


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

1 0
原创粉丝点击