2012-03-12 126 views
1

我想观察sentreceived短信在我的应用。接收短信工作正常,但发送短信时有问题。当用户同时发送多个SMS(群SMS)时,会跳过一些SMS(onChange()中没有日志)。另外,当观察到的光标正在更新两次时,onChange()会被调用两次。那么,有谁能告诉我这里有什么问题。我怎样才能在发送的短信中获得所有发送的短信详细信息。下面是我观察发送和接收短信的代码。ContentObserver的的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"))); 
      } 
     } 
    } 

而且我refered一些链接/使用deliverSelfNotifications()返回true受限onChange()被称为两倍坚持的答案,但是这也不能正常工作。它仍然被调用两次。

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

下面是我的logcat输出,当我发出4消息从模拟器/设备 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。所以,任何人都可以给我解决方案/为什么会发生这种情况,我能做些什么来获得前两条消息。

回答

0

根据您的日志似乎onChangeSMS称为8次,两次。前4次没有达到"Message Body and ID"一行,所以无论是光标是null还是cursor.moveToFirst()都返回false。你能检查哪一个是这种情况?

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

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

+0

@Cancer我登录并检查光标永远不能为null,它总是'cursor.moveToFirst()'返回true。 – 2012-03-13 05:21:00

0

尝试onChange

使用布尔selfChange这样

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

已经试过它总是返回selfChange false。我曾使用SMSId进行管理,但仍有一些短信被跳过。 – 2012-03-13 05:39:40