2012-03-12 7 views
1

私のアプリケーションでsentreceived SMSを観察したいと思います。 SMSの受信は問題なく動作しますが、SMSの送信に問題があります。ユーザーが複数のSMSを次々に送信すると(グループSMS)、SMSの一部がスキップされます(onChange()内のログはありません)。また、onChange()は、観測されたカーソルが2回更新されているため、2回呼び出されています。だから誰も私にここで何が問題か教えてもらえますか?送信されたすべてのSMSの詳細を送信済みSMSで取得するにはどうすればよいですか。以下は、送受信されたSMSを観察するためのコードです。ContentObserverのonChange()がいくつかのSMS送信をスキップします。グループSMS

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"))); 
      } 
     } 
    } 

はまた、私はいくつかのリンク/二回呼び出されている制限onChange()にtrueを返しdeliverSelfNotifications()を使用して主張した答えを参照さが、これも機能していません。まだ2回呼び出されます。以下は

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

私はエミュレータ/デバイス から4のメッセージを送ったときに、AAAA、BBBB、CCCC、DDDD、それは私だけ、最後の二つのメッセージの詳細を与え、最初の二つはスキップされました、私のLogcat出力です。

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

ログによると、は、SMSに2回、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ようonChange

にブールselfChangeを使用して試してみて、そのカーソルがnullになることはありませんチェックし、それは常に 'cursor.moveToFirst()'のためにtrueを返します。 –

0

は、私がログインしてこの

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

は、常にselfChange falseを返すように試みました。私はSMSIdを使用して管理していましたが、SMSの一部はスキップされます。 –

関連する問題