android 短信管理(获取接受到短信的消息)


这几天在弄短信的东东,主要是想做一个用户使用短信支付的接口,殊不知国内省份不一样,接口众多呀!感叹国家地域的辽阔和房价的高不可攀的矛盾。。。。

接口不是重点,重点是关于获取接受短信的消息,当然最熟悉的还是BroadcastReceiver来监听,这是一般的模式,网上一大把!

其实还有另一种方式,就是观察者模式(其实说是监听更好理解一些),无非是观察(或者说是监听)短信的数据库的变化!这个在android上是支持的,但是要声明获取权限


[java]  view plain copy print ?
  1. <span style="font-size:18px;"><uses-permission android:name="android.permission.READ_SMS"/>  
  2.   
  3. <uses-permission android:name="android.permission.WRITE_SMS"/></span>  


下面要做的就是自定义一个观察类,声明它观察的事件


[java]  view plain copy print ?
  1. <span style="font-size:18px;">/** 
  2.      * 监听数据库内容改变,根据具体的号码来删除短信 
  3.      */  
  4.     private class SMSContent extends ContentObserver  
  5.     {  
  6.         private Cursor cursor = null;  
  7.   
  8.         public SMSContent(Handler handler)  
  9.         {  
  10.             super(handler);  
  11.             // TODO Auto-generated constructor stub  
  12.         }  
  13.   
  14.         /* (non-Javadoc) 
  15.          * @see android.database.ContentObserver#onChange(boolean) 
  16.          */  
  17.         @Override  
  18.         public void onChange(boolean selfChange)  
  19.         {  
  20.             // TODO Auto-generated method stub  
  21.             super.onChange(selfChange);  
  22.               
  23.             System.out.println("Change...");  
  24.               
  25.                         /** 
  26.                         * 数据库查询,具体各个字段的表示的含义下面有解释 
  27.                         */  
  28.             cursor = managedQuery(Uri.parse("content://sms/inbox"),   
  29.                     new String[]{"_id""address""read"},   
  30.                     "address=? and read=?",   
  31.                     new String[]{"125201510100x00y""0"},   
  32.                     "date desc");  
  33.               
  34.             if(cursor != null)  
  35.             {  
  36.                 System.out.println(cursor.getCount());;  
  37.                 ContentValues values = new ContentValues();  
  38.                 values.put("read"1);  
  39.                 cursor.moveToFirst();  
  40.                 while(cursor.isLast())  
  41.                 {  
  42.                     System.out.println(cursor.getString(1));  
  43.                     getContentResolver().update(Uri.parse("content://sms/inbox"),   
  44.                             values,   
  45.                             "_id=?",   
  46.                             new String[]{"" + cursor.getInt(0)});  
  47.                     cursor.moveToNext();  
  48.                 }  
  49.             }  
  50.         }  
  51.           
  52.     }</span>  


这个观察类很简单,就是在onChange()方法中写好要过滤到的数据条目(也就是短信)我这里是判断的是来自1252015101006007,并且“未读”(read=0)的短信,我的初衷是将收到的符合上述类型的短信标记为“已读”,可是最后却不能成功,因为我的手机刷的是小米的系统,系统做了深度定制,比较系统的优先级要大于你程序的优先级,所以系统会先处理你收到短信的消息,但是你确实是也可以收到短信的消息的,这个很重要(因为有些省份的短信扣费需要二次确认,所以你要监听你第二条短信收到的消息)。


在任何你想要用到这个观察类的地方,实例化,注册,就ok了。


[java]  view plain copy print ?
  1. <span style="font-size:18px;">SMSContent smsContent = new SMSContent(new Handler());  
  2.         //注册短信数据库修改监听  
  3.         getContentResolver().registerContentObserver(Uri.parse("content://sms/"),   
  4.                 true, smsContent);</span>  


短信数据库中各字段的含义总结如下:

_id:自增的唯一ID,主键

thread_id:同一号码的短信这个值是相同的

address:发送者的号码

person:发送者在你通讯录中的标记

read:未读和已读(0未读,1已读,上面的例子用到了)

date:日期

status:有4种(发送成功,失败,发送中)

type:收到或者发送的(1收到的,2发送的)

body:短信内容

这个总结网上很多,当然也可以下载一个SQLite Brower自己来看!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值