这几天在弄短信的东东,主要是想做一个用户使用短信支付的接口,殊不知国内省份不一样,接口众多呀!感叹国家地域的辽阔和房价的高不可攀的矛盾。。。。
接口不是重点,重点是关于获取接受短信的消息,当然最熟悉的还是BroadcastReceiver来监听,这是一般的模式,网上一大把!
其实还有另一种方式,就是观察者模式(其实说是监听更好理解一些),无非是观察(或者说是监听)短信的数据库的变化!这个在android上是支持的,但是要声明获取权限
- <span style="font-size:18px;"><uses-permission android:name="android.permission.READ_SMS"/>
- <uses-permission android:name="android.permission.WRITE_SMS"/></span>
下面要做的就是自定义一个观察类,声明它观察的事件
- <span style="font-size:18px;">/**
- * 监听数据库内容改变,根据具体的号码来删除短信
- */
- 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();
- }
- }
- }
- }</span>
这个观察类很简单,就是在onChange()方法中写好要过滤到的数据条目(也就是短信)我这里是判断的是来自1252015101006007,并且“未读”(read=0)的短信,我的初衷是将收到的符合上述类型的短信标记为“已读”,可是最后却不能成功,因为我的手机刷的是小米的系统,系统做了深度定制,比较系统的优先级要大于你程序的优先级,所以系统会先处理你收到短信的消息,但是你确实是也可以收到短信的消息的,这个很重要(因为有些省份的短信扣费需要二次确认,所以你要监听你第二条短信收到的消息)。
在任何你想要用到这个观察类的地方,实例化,注册,就ok了。
- <span style="font-size:18px;">SMSContent smsContent = new SMSContent(new Handler());
- //注册短信数据库修改监听
- getContentResolver().registerContentObserver(Uri.parse("content://sms/"),
- true, smsContent);</span>
短信数据库中各字段的含义总结如下:
_id:自增的唯一ID,主键
thread_id:同一号码的短信这个值是相同的
address:发送者的号码
person:发送者在你通讯录中的标记
read:未读和已读(0未读,1已读,上面的例子用到了)
date:日期
status:有4种(发送成功,失败,发送中)
type:收到或者发送的(1收到的,2发送的)
body:短信内容
这个总结网上很多,当然也可以下载一个SQLite Brower自己来看!