Android:ContentObserver触发次数更多

时间:2014-03-05 06:35:18

标签: android

我编写了一个应用程序,用于侦听默认消息传递应用程序发送的短信。

当我使用以下代码时,该应用程序未触发短信发送。

    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中显示两次而不是一次。有人可以告诉我,有没有其他方法找出发送的短信?
任何帮助都是赞赏的。

1 个答案:

答案 0 :(得分:0)

这似乎是一个常见问题。我尝试了其他几种方法,最后提出了解决方案。

在我的情况下,ContentObserver的onChange()被触发三次,用于传出短信。 我看到你尝试过使用类型 - > cur.getColumnIndex("类型&#34)。类型可以是6,4或2.在我的情况下,在触发事件的三次中,有两次我得到了类型2.这看起来不可靠。还有不确定性是否在所有设备中都是相同的。 我通过使用smsCursor.getString(msgIndex)检查messageID来解决这个问题。将其存储在SharedPreference中。下次事件触发时将旧消息ID与新消息ID进行比较。仅在ID不同时提取内容。这样就可以避免重复。