這幾天在弄短信的東東,主要是想做一個用戶使用短信支付的接口,殊不知國內省份不一樣,接口衆多呀!感嘆國家地域的遼闊和房價的高不可攀的矛盾。。。。
接口不是重點,重點是關於獲取接受短信的消息,當然最熟悉的還是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自己來看!