下面出处:http://blog.csdn.net/by317966834/article/details/7591451
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于
数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,
相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。
熟悉Content Provider(内容提供者)的应该知道,我们可以通过UriMatcher类注册不同类型的Uri,我们可以通过这些不同的
Uri来查询不同的结果。根据Uri返回的结果,Uri Type可以分为:返回多条数据的Uri、返回单条数据的Uri。
短信的Uri共有一下几种:
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱 (正在发送的信息)
content://sms/failed 发送失败
content://sms/queued 待发送列表 (比如开启飞行模式后,该短信就在待发送列表里)
http://blog.csdn.net/wanglj0925/article/details/7599082
下面个人经验部分:
监听短信,并将获取的验证码自动填入待填区!
public class smsObserver extends ContentObserver{
private Context mContext;
private Handler mHandler;
public smsObserver(Context mContext, Handler mHandler) {
super(mHandler);
this.mContext = mContext;
this.mHandler = mHandler;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
Log.e("DEBUG","SMS has changed");
Log.e("DEBUG",uri.toString());
if(uri.toString().equals("content://sms//raw")){
return;
}
Uri inboUri=uri.parse("content://sms/inbox");
Cursor c=mContext.getContentResolver().query(inboUri, null,
null, null, "date desc");//按照日期倒序排列
if(c!=null){
if(c.moveToNext()){
String address=c.getString(c.getColumnIndex("address"));
String body=c.getString(c.getColumnIndex("body"));
Log.e("DEBUG","发件人为:"+address+"短信内容为:"+body);
Pattern p=Pattern.compile("\\d{6}");//匹配第一次出现的四位数字
Matcher m=p.matcher(body);
if(m.find()){
String code=m.group(0);
Log.e("DEBUG","验证码"+code);
mHandler.obtainMessage(MainActivity.MSG_RECEIVE_CODE,code).sendToTarget();
}
}
c.close();
}
}
}
Uri uri=Uri.parse("content://sms");
getContentResolver().registerContentObserver
(uri, true, observer);
protected void onPause() {
super.onPause();
getContentResolver().unregisterContentObserver(observer);
}
@Override
public void handleMessage(Message msg) {
if(msg.what==MSG_RECEIVE_CODE){
String code=(String)msg.obj;
//更新UI
Toast.makeText(MainActivity.this, code+"66666666",Toast.LENGTH_SHORT).show();
}
}
};