2014-03-05 43 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不同时提取内容。这样你可以避免重复。