在这里跟大家分享下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);
}
}
}
}
}
所有解释都在代码注释上,注意要增加短信的权限。
今天的分享都在这里了,根据需求可更改判断的条件和判断短信的内容。