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


這幾天在弄短信的東東,主要是想做一個用戶使用短信支付的接口,殊不知國內省份不一樣,接口衆多呀!感嘆國家地域的遼闊和房價的高不可攀的矛盾。。。。

接口不是重點,重點是關於獲取接受短信的消息,當然最熟悉的還是BroadcastReceiver來監聽,這是一般的模式,網上一大把!

其實還有另一種方式,就是觀察者模式(其實說是監聽更好理解一些),無非是觀察(或者說是監聽)短信的數據庫的變化!這個在android上是支持的,但是要聲明獲取權限


  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>  


下面要做的就是自定義一個觀察類,聲明它觀察的事件


  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了。


  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自己來看!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章