2012-05-31 7 views
6
gelesen wird

Ich suchte ziemlich viel in den Foren für die Bestimmung, wie viele SMS-Nachrichten ich nicht gelesen habe. Der folgende Code scheint gut für empfangene Nachrichten zu funktionieren, aber sobald ich die Nachricht gelesen habe, wird der onChange des ContentObservers nicht aufgerufen. Also, bei eingehenden SMS-Nachricht wird der onChange aufgerufen und ich bekomme die richtige Nummer, aber nach dem Lesen der Nachricht wird es nicht aufgerufen. Das Gerät ist Samsung Note mit Android 2.3.6 nicht gerootet. Jede Hilfe wird geschätzt.onChange-Methode von ContentObserver nicht aufgerufen, wenn SMS-Nachricht auf Android

public class UnreadSMSContentObserver extends ContentObserver { 
    private static final String myTAG="PhoneInfoSMS"; 
    private static final Uri SMS_INBOX = Uri.parse("content://sms/inbox"); 

    private ContentResolver mContentResolver; 
    private Handler mHandler; 
    public int unreadSMS; 
    private static final String TAG = "PhoneInfoSMS"; 

    public UnreadSMSContentObserver(ContentResolver cr, Handler h) { 
     super(null); 
     mContentResolver = cr; 
     mHandler = h; 
    } 

    public int getUnreadSMS() { 
     if (mContentResolver != null) { 
      try { 
       Cursor c = mContentResolver.query(SMS_INBOX, null, "read = 0", null, null); 
       if (c != null) { 
        unreadSMS = c.getCount(); 
        c.deactivate(); 
        Log.d(TAG, unreadSMS + " unread SMS messages"); 
        } 
       } 
      catch (Exception ex) { 
       Log.e("ERROR: " + ex.toString(), ""); 
      } 
     } 
     return unreadSMS; 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     Log.d(myTAG, "onChange"); 
     if (mContentResolver != null) { 
      getUnreadSMS(); 
      mHandler.obtainMessage(PhoneInfoServer.CONTENTO_INFOCHANGED, PhoneInfoServer.CONTENTO_US, unreadSMS).sendToTarget(); 
      Log.d(myTAG, "done"); 
     } 
    } 
} 

In der Manifest-Datei ich die folgenden Berechtigungen verfügen:

"android.permission.READ_CONTACTS" 
"android.permission.READ_SMS" 
"android.permission.GET_ACCOUNTS" 
"android.permission.BATTERY_STATS" 
"android.permission.BLUETOOTH" 
"android.permission.BLUETOOTH_ADMIN" 
"android.permission.BROADCAST_SMS" 
"android.permission.RECEIVE_SMS" 
"android.permission.BROADCAST_SMS" 
"android.permission.RECEIVE_MMS" 

So wie ich es auf dem Telefonie-Dienst ist eingerichtet: im onCreate des Dienstes ich tun:

mContentResolver = this.getContentResolver(); 
mUnreadSMSContentObserver = new UnreadSMSContentObserver(mContentResolver, mContentObserversHandler); 

im onStartCommand des Dienstes, den ich mache:

mContentResolver.registerContentObserver(Uri.parse("content://sms/"), true, mUnreadSMSContentObserver);    
mContentResolver.registerContentObserver(Uri.parse("content://sms/inbox/"), true, mUnreadSMSContentObserver); 

Ich habe versucht, nur den Inhalt: // SMS/und nur Inhalt: // SMS/Posteingang/und beide ... löste das Problem nicht.

P.S. Eine ähnliche Methode für die verpassten Anrufe funktioniert perfekt!

Die Anwendung + Service sendet über Bluetooth die Batteriedaten, verpasste Anrufe und ungelesene SMS an ein Arduino-basiertes Gerät, das es auf einem LED-Bildschirm anzeigt. Warum? Zwei Gründe: Erstens ist dies mein erstes Android-Programm zum Spaß. Die zweite ist, dass ich das Telefon nicht ständig bei mir zuhause habe und es normalerweise in meinem Büro zuhause ist. Wenn ich es nicht klingeln höre, kann ich immer noch die LED-Anzeige sehen, die mir sagt, dass ich Anrufe oder SMS hatte, wenn ich vorbeikam.

+0

Sollten Sie nicht super nicht anrufen Super (h) werden, (null)? – matt5784

Antwort

1

hat diese Lösung für mich gearbeitet:

context.getContentResolver(). 
       registerContentObserver(Uri.parse("content://mms-sms/"), true, smsObserver); 
+0

Es hat für mich funktioniert! – sandy

Verwandte Themen