2012-05-31 9 views
6

Mi sembrava un po 'sui forum per determinare quanti messaggi SMS ho che non sono stati letti. Il codice seguente sembra funzionare correttamente per i messaggi ricevuti, ma una volta che ho effettivamente letto il messaggio non viene chiamato onChange del ContentObserver. Quindi, sul messaggio SMS in arrivo, onChange viene chiamato e ottengo il numero corretto, ma dopo aver letto il messaggio non viene chiamato. Il dispositivo è Samsung Note con Android 2.3.6 non rootato. Qualsiasi aiuto sarà apprezzato.Metodo onChange di ContentObserver non chiamato quando il messaggio SMS viene letto su 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"); 
     } 
    } 
} 

nel file manifesto che ho le seguenti autorizzazioni:

"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" 

Il mio modo di impostare il tutto sul servizio di chiamata è: nel onCreate del servizio che faccio:

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

nel onStartCommand del servizio che faccio:

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

Ho provato solo il contenuto: // sms/e solo il contenuto: // sms/inbox/ed entrambi ... non hanno risolto il problema.

P.S. Un metodo simile per le chiamate perse funziona perfettamente!

L'applicazione + servizio invia tramite Bluetooth i dati della batteria, chiamate perse e messaggi SMS non letti a un dispositivo basato su Arduino che lo visualizza su uno schermo a LED. Perché? Due motivi: primo, questo è il mio primo programma Android fatto per divertimento. Il secondo è che non porto il telefono con me a casa tutto il tempo, ed è tipicamente nel mio ufficio di casa. Se non lo sento squillare sarò ancora in grado di vedere il display a LED che mi dice che ho ricevuto chiamate o SMS quando passo.

+0

Non dovresti essere chiamando super (h), non super (null)? – matt5784

risposta

1

questa soluzione ha funzionato per me:

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

Ha funzionato per me! – sandy

Problemi correlati