2011-08-10 42 views
6

我正在嘗試製作一個應用程序來統計手機中傳出的SMS消息的數量。目前我有以下代碼:Android:檢測短信傳出,錯誤計數

private void listenForSMS(){ 
    Log.v("SMSTEST", "STARTED LISTENING FOR SMS OUTGOING"); 
    Handler handle = new Handler(){}; 

    SMSObserver myObserver = new SMSObserver(handle); 

    ContentResolver contentResolver = getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms"),true, myObserver); 
} 

private class SMSObserver extends ContentObserver{ 

    int count = 0; 
    String lastMessage = null; 

    public SMSObserver(Handler handler) { 
     super(handler); 
    } 

    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 

     Log.v("SMSTEST", "HIT ON CHANGE"); 

     Uri uriSMSURI = Uri.parse("content://sms"); 
     Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
        null, null); 
     cur.moveToNext(); 
     String protocol = cur.getString(cur.getColumnIndex("protocol")); 
     if(protocol == null){ 
      count++; 
      Log.v("SMSTEST", "SMS SENT: count: " + count); 
      String content = cur.getString(cur.getColumnIndex("body")); 

     }else{ 
      Log.v("SMSTEST", "SMS RECIEVED"); 
     } 
    } 
} 

當我發送一個網頁短信,onChange被稱爲3倍。當我發送兩頁短信時,onChange被調用4次。 3頁的信息,被稱爲5次;等等。

注意:我嘗試了Uri.parse("content://sms")的其他變體,例如「content:// sms/sent」,除了「content:// sms」之外沒有任何東西被調用onChange

如何唯一地區分發送的SMS消息並獲得發送的SMS消息的數量的準確計數?

+0

我發現了一個其實很簡單的解決方案。只需建立一個while循環並查詢WHERE date> = someTime。 –

回答

2

我找到了解決我的問題的方法。短信和彩信可以通過其_id值進行唯一區分。

Uri uriSMSURI = Uri.parse("content://sms"); 
    Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
       null, null); 
    cur.moveToNext(); 
String id = cur.getString(cur.getColumnIndex("_id")); 
0

如何唯一地區分發送的SMS消息並獲得發送的SMS消息的數量的準確計數?

你不行。

此內容提供者不是Android SDK的一部分。它的使用是沒有文檔和不受支持的。此外,任何給定的消息客戶端(例如,AOSP Messenger應用程序)如何使用它本身都是未記錄的並且不受支持。一次發送的短信可能會導致內容提供商發生1,337次更改,您無法知道。此外,不需要發送SMS消息甚至被記錄在這個或任何內容提供商中。而且,如果recent behavior有任何跡象,Google可能會在將來關閉對此內容提供商的第三方訪問。

4

請注意,當您發送短信時,它將保存消息的狀態。爲了解決這個問題,你檢查的該類型記錄int type = c.getInt(c.getColumnIndex("type")); 3倍的onchange():
1:類型= 6
第二:類型= 4
3:類型= 2(成功)
那麼你可以增加你的計數器。
此案例僅適用於1位收件人。
如果有更多的1收件人,需要重新查詢「thread_id」和「看到」來獲取類型。您可以檢查發送成功的郵件數量。
祝你好運!

+0

這是我可以找到重複短信觸發器的最佳解決方案。在我的情況下,只有即將離任的短信觸發了三次。傳入的短信沒有問題。 這些狀態中的每一個代表什麼?什麼是6和4?我沒有看到類型4.第一次獲得類型6,然後兩次獲得類型2.類型代碼是否因設備而異?這是可靠的嗎? – nous

+0

@kevin:是否可以處理失敗情況? –