ContentObserver的onChange()跳过一些发送群组短信的短信

时间:2012-03-12 13:32:25

标签: android

我想在我的应用程序中观察sentreceived短信。接收短信工作正常,但发送短信时出现问题。当用户同时一个接一个地发送多个SMS(组SMS)时,会跳过一些SMS(onChange()中没有日志)。此外,onChange()被调用两次,因为观察到的光标正在被更新两次。所以,谁能告诉我这里的问题是什么。如何在发送的短信中获取所有已发送的短信详细信息。以下是我观察发送和接收短信的代码。

onChange()方法实现,

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

        Log.d(getClass().getSimpleName(), "onChanged called");
        Cursor cursor = mContext.getContentResolver().query(Uri
                                .parse("content://sms"), null, null, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                Log.d("Message Body and ID ",cursor.getString(cursor
                                                       .getColumnIndex("body")));
            } 
        }
    }

此外,我提到了一些链接/答案,这些链接/答案坚持使用deliverSelfNotifications()将true返回到被调用两次的受限onChange(),但这也无效。它仍然会被调用两次。

@Override
    public boolean deliverSelfNotifications() {
        return true;
    }

当我从模拟器/设备发送4条消息时,下面是我的Logcat输出 Aaaa,Bbbb,Cccc,Dddd,它只给了我最后两条消息的详细信息,前两条消息被跳过了。

03-12 18:51:19.809: DEBUG/MyContentObserver(1354): onChanged called
03-12 18:51:21.458: DEBUG/MyContentObserver(1354): onChanged called
03-12 18:51:22.648: DEBUG/MyContentObserver(1354): onChanged called
03-12 18:51:25.508: DEBUG/MyContentObserver(1354): onChanged called
03-12 18:51:28.568: DEBUG/MyContentObserver(1354): onChanged called
03-12 18:51:28.812: WARN/dalvikvm(103): JNI: pin count on array 0x40051200 ([C) is now 11
03-12 18:51:28.841: WARN/dalvikvm(103): JNI: pin count on array 0x40051200 ([C) is now 11
03-12 18:51:28.841: WARN/dalvikvm(103): JNI: pin count on array 0x40051200 ([C) is now 11
03-12 18:51:28.841: WARN/dalvikvm(103): JNI: pin count on array 0x40051200 ([C) is now 11
03-12 18:51:30.348: DEBUG/dalvikvm(103): GREF has increased to 601
03-12 18:51:31.798: DEBUG/dalvikvm(189): GREF has increased to 501
03-12 18:51:32.529: DEBUG/dalvikvm(103): GC freed 8501 objects / 577704 bytes in 447ms
03-12 18:51:32.998: DEBUG/dalvikvm(189): GC freed 13158 objects / 515104 bytes in 324ms
03-12 18:51:33.538: DEBUG/MyContentObserver(1354): onChanged called
03-12 18:51:33.768: WARN/KeyCharacterMap(189): No keyboard for id 0
03-12 18:51:33.778: WARN/KeyCharacterMap(189): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
03-12 18:51:35.194: DEBUG/Message Body and ID(1354): Cccc
03-12 18:51:35.548: DEBUG/MyContentObserver(1354): onChanged called
03-12 18:51:37.658: DEBUG/MyContentObserver(1354): onChanged called
03-12 18:51:38.308: DEBUG/Message Body and ID(1354): Ddd

正如您所看到的,我只在logcat输出中获得了Cccc和Dddd。那么,任何人都可以给我解决方案/原因,为什么会发生这种情况,我还能做些什么来获得前两条消息。

2 个答案:

答案 0 :(得分:0)

根据您的日志,似乎onChange被调用8次,每SMS次调用两次。前4次未达到"Message Body and ID"行,因此光标为nullcursor.moveToFirst()返回false。你能检查一下是哪种情况吗?

在任何一种情况下,这听起来像是一个时间问题,当您调用onChange并且sms db不是最新的(可用?)时会出现同步问题。

出于测试目的,您可以sleep几秒钟检查mContext.getContentResolver().query(Uri.parse("content://sms"), null, null, null, null);如果您等待的话,是否会返回任何不同的内容。

答案 1 :(得分:0)

尝试在selfChange

中使用布尔onChange 像这样

if(selfChange)
{
 // paste your code here
}
else
{
 return;
}