2014-03-05 61 views
0

我寫了一個應用程序來偵聽從默認消息應用程序發送的短信。Android:ContentObserver觸發次數更多

當我使用下面的代碼時,該應用程序不會觸發發送短信。

SMSSentObserver smsSentObserver = new SMSSentObserver(null, this); 
    ContentResolver contentResolver = this.getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, smsSentObserver); 

然後通過使用下面的代碼,ContentObserver被觸發。

SMSSentObserver smsSentObserver = new SMSSentObserver(null, this); 
    ContentResolver contentResolver = this.getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms"), true, smsSentObserver); 

我能夠監聽發送短信,但SMSSentObserver(實現ContentObserver)onCreate()方法被調用超過一次。 然後我向代碼添加條件以找出發送的短信事件。但條件通過了兩個事件。

public class SMSSentObserver extends ContentObserver { 
     private final Context _context; 

     public SMSSentObserver(Handler handler, Context context) { 
      super(null); 
      _context = context; 
     } 

     @Override 
     public void onChange(boolean selfChange) { 
      saveSentSMS(); 
      super.onChange(selfChange); 
     } 

     private void saveSentSMS() { 
      Uri uriSMSURI = Uri.parse("content://sms/sent"); 
      Cursor cur = this._context.getContentResolver().query(uriSMSURI, null, null, null, null); 

      if(null == cur) { 
       return; 
      } 

      if(cur.moveToFirst()) { 
       String strProtocol = cur.getString(cur.getColumnIndex("protocol")); 
       if(null != strProtocol) { //for sent messages protocol will be null. 
        return; 
       } 

       int type = cur.getInt(cur.getColumnIndex("type")); 
       if(type == 2) { 
        String strSMSBody = cur.getString(cur.getColumnIndex("body")); 
        String strPhoneNo = cur.getString(cur.getColumnIndex("address")); 
        long smsDateTime = cur.getLong(cur.getColumnIndex("date")); 
        String serviceCenter = cur.getString(cur.getColumnIndex("service_center")); 
        String strStatus = cur.getString(cur.getColumnIndex("status")); 
        String strPerson = cur.getString(cur.getColumnIndex("person")); 
        Log.e("Info", "SMS saved"); 
       } 
      } 
     } 
    } 

「短信保存」在catlog中顯示兩次而不是一次。有人可以告訴我,有沒有其他方法來找出發送的短信?
任何幫助被讚賞。

回答

0

這似乎是一個常見問題。我嘗試了其他幾種方法,最終提出了一個解決方案。

ContentObserver的onChange()在我的情況下被觸發三次,用於傳出短信。 我看到你已經嘗試使用類型 - > cur.getColumnIndex(「type」)。該類型可以是6,4或2.在我的情況下,在事件觸發的三次中,有兩次我得到了類型2.似乎不可靠。此外,在所有設備中這一點是否相同也是不確定的。 我通過使用smsCursor.getString(msgIndex)檢查messageID來解決此問題。將其存儲在SharedPreference中。下一次事件觸發器將舊消息ID與新消息ID進行比較。僅在ID不同時提取內容。這樣你可以避免重複。