2012-05-31 8 views
6

Estaba buscando bastante en los foros para determinar cuántos mensajes SMS tengo que no fueron leídos. El siguiente código parece funcionar bien para los mensajes recibidos, pero una vez que realmente leo el mensaje, no se llama al cambio de ContentObserver. Entonces, en el mensaje SMS entrante, se llama al onChange y obtengo el número correcto, pero después de leer el mensaje , no se llama. El dispositivo es Samsung Nota con Android 2.3.6 no rooteado. Cualquier ayuda será apreciada.Método de cambio de ContentObserver no llamado cuando se lee un mensaje SMS en 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"); 
     } 
    } 
} 

En el archivo de manifiesto tengo los siguientes permisos:

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

La forma lo instalo en el servicio de llamadas es: en onCreate del servicio que hago:

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

en onStartCommand del servicio que hago:

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

Probé solo el contenido: // sms/y solo el contenido: // sms/inbox/y ambos ... no resolvió el problema.

P.S. ¡Un método similar para las llamadas perdidas funciona perfecto!

La aplicación + servicio está enviando a través de Bluetooth los datos de la batería, llamadas perdidas y mensajes SMS no leídos a un dispositivo basado en Arduino que lo muestra en una pantalla LED. ¿Por qué? Dos razones: primero, este es mi primer programa de Android creado para divertirme. El segundo es que no llevo el teléfono conmigo en casa todo el tiempo, y generalmente está en la oficina de mi casa. Si no lo oí sonar, aún podré ver la pantalla LED que me dice que tenía llamadas o SMS cuando pasaba.

+0

No deberías estar llamando super (h), no super (null)? – matt5784

Respuesta

1

esta solución ha funcionado para mí:

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

¡Funcionó para mí! – sandy

Cuestiones relacionadas