这几天在弄短信的东东,主要是想做一个用户使用短信支付的接口,殊不知国内省份不一样,接口众多呀!感叹国家地域的辽阔和房价的高不可攀的矛盾。。。。
接口不是重点,重点是关于获取接受短信的消息,当然最熟悉的还是BroadcastReceiver来监听,这是一般的模式,网上一大把!
其实还有另一种方式,就是观察者模式(其实说是监听更好理解一些),无非是观察(或者说是监听)短信的数据库的变化!这个在android上是支持的,但是要声明获取权限
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
下面要做的就是自定义一个观察类,声明它观察的事件
/**
* 监听数据库内容改变,根据具体的号码来删除短信
*/
private class SMSContent extends ContentObserver
{
private Cursor cursor = null;
public SMSContent(Handler handler)
{
super(handler);
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see android.database.ContentObserver#onChange(boolean)
*/
@Override
public void onChange(boolean selfChange)
{
// TODO Auto-generated method stub
super.onChange(selfChange);
System.out.println("Change...");
/**
* 数据库查询,具体各个字段的表示的含义下面有解释
*/
cursor = managedQuery(Uri.parse("content://sms/inbox"),
new String[]{"_id", "address", "read"},
"address=? and read=?",
new String[]{"125201510100x00y", "0"},
"date desc");
if(cursor != null)
{
System.out.println(cursor.getCount());;
ContentValues values = new ContentValues();
values.put("read", 1);
cursor.moveToFirst();
while(cursor.isLast())
{
System.out.println(cursor.getString(1));
getContentResolver().update(Uri.parse("content://sms/inbox"),
values,
"_id=?",
new String[]{"" + cursor.getInt(0)});
cursor.moveToNext();
}
}
}
}
这个观察类很简单,就是在onChange()方法中写好要过滤到的数据条目(也就是短信)我这里是判断的是来自1252015101006007,并且“未读”(read=0)的短信,我的初衷是将收到的符合上述类型的短信标记为“已读”,可是最后却不能成功,因为我的手机刷的是小米的系统,系统做了深度定制,比较系统的优先级要大于你程序的优先级,所以系统会先处理你收到短信的消息,但是你确实是也可以收到短信的消息的,这个很重要(因为有些省份的短信扣费需要二次确认,所以你要监听你第二条短信收到的消息)。
在任何你想要用到这个观察类的地方,实例化,注册,就ok了。
SMSContent smsContent = new SMSContent(new Handler());
//注册短信数据库修改监听
getContentResolver().registerContentObserver(Uri.parse("content://sms/"),
true, smsContent);
短信数据库中各字段的含义总结如下:
_id:自增的唯一ID,主键
thread_id:同一号码的短信这个值是相同的
address:发送者的号码
person:发送者在你通讯录中的标记
read:未读和已读(0未读,1已读,上面的例子用到了)
date:日期
status:有4种(发送成功,失败,发送中)
type:收到或者发送的(1收到的,2发送的)
body:短信内容
这个总结网上很多,当然也可以下载一个SQLite Brower自己来看!
PS:我认为小米系统是不能拦截到短信的,不知道高手们有什么高招,望指点!