2011-08-10 13 views
6

Estoy tratando de hacer una aplicación para contar la cantidad de mensajes SMS salientes desde un teléfono. Actualmente tengo el siguiente código:Android: detectar SMS saliente, cuenta incorrecta

private void listenForSMS(){ 
    Log.v("SMSTEST", "STARTED LISTENING FOR SMS OUTGOING"); 
    Handler handle = new Handler(){}; 

    SMSObserver myObserver = new SMSObserver(handle); 

    ContentResolver contentResolver = getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms"),true, myObserver); 
} 

private class SMSObserver extends ContentObserver{ 

    int count = 0; 
    String lastMessage = null; 

    public SMSObserver(Handler handler) { 
     super(handler); 
    } 

    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 

     Log.v("SMSTEST", "HIT ON CHANGE"); 

     Uri uriSMSURI = Uri.parse("content://sms"); 
     Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
        null, null); 
     cur.moveToNext(); 
     String protocol = cur.getString(cur.getColumnIndex("protocol")); 
     if(protocol == null){ 
      count++; 
      Log.v("SMSTEST", "SMS SENT: count: " + count); 
      String content = cur.getString(cur.getColumnIndex("body")); 

     }else{ 
      Log.v("SMSTEST", "SMS RECIEVED"); 
     } 
    } 
} 

Cuando envío un mensaje SMS de una página, onChange se llama 3 veces. Cuando envío un mensaje de texto de dos páginas, se llama al onChange 4 veces. Mensaje de 3 páginas, llamado 5 veces; Y así.

NOTA: He intentado otras variaciones de Uri.parse("content://sms"), como "contenido: // sms/enviado", y nada más que "contenido: // sms" ha recibido onChange para ser llamado.

¿Cómo puedo distinguir de manera única un mensaje SMS saliente y obtener una cuenta exacta de la cantidad de mensajes SMS enviados?

+0

Encontré una solución que es bastante simple. Simplemente haga un ciclo while y consulte WHERE date> = someTime. –

Respuesta

2

Encontré una solución a mi problema. Los SMS y MMS se pueden distinguir de forma única por su valor _id.

Uri uriSMSURI = Uri.parse("content://sms"); 
    Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
       null, null); 
    cur.moveToNext(); 
String id = cur.getString(cur.getColumnIndex("_id")); 
0

¿Cómo puedo distinguir de forma única un mensaje SMS saliente y obtener un conteo preciso de la cantidad de mensajes SMS enviados?

No puede.

Este proveedor de contenido no es parte del SDK de Android. Su uso no está documentado ni respaldado. Además, la forma en que un cliente de mensajería determinado (por ejemplo, la aplicación AOSP Messenger) podría usarlo no está documentado ni respaldado. Un solo mensaje de texto enviado podría generar 1.337 cambios en el proveedor de contenido, y usted no tiene forma de saberlo. Además, no es necesario que los mensajes SMS salientes se graben en este o en ningún proveedor de contenido. Y, si recent behavior es una indicación, es posible que Google cierre el acceso de terceros a este proveedor de contenido en el futuro.

4

Tenga en cuenta que, cuando envíe un mensaje de texto, guardará el estado del mensaje. Para solucionarlo, se comprueba el tipo de que registra int type = c.getInt(c.getColumnIndex("type")); 3 veces onchange():
primero: type = 6
segundo: type = 4
tercera: Tipo = 2 (éxito)
continuación, usted puede aumentar su mostrador.
Este caso se aplica solo para 1 destinatario.
Si hay mucho más 1 destinatario, necesita volver a consultar "thread_id" y "seen" para obtener el tipo. Puede verificar cuántos mensajes se envían correctamente.
¡Buena suerte!

+0

Esta es la mejor solución que pude encontrar para los disparadores de sms duplicados. En mi caso, solo el sms saliente se activó tres veces. No hay problemas con sms entrantes. ¿Qué representa cada uno de estos estados? ¿Qué es 6 y 4? No veo el tipo 4. La primera vez que obtengo el tipo 6, otras dos veces obtengo el tipo 2. ¿El código de tipo varía de un dispositivo a otro? ¿Es esto confiable? – nous

+0

@kevin: ¿Es posible manejar el escenario de fallas? –