2011-05-30 19 views
5

http://mobiforge.com/developing/story/sms-messaging-androidObteniendo múltiples transmisiones desde intenciones?

Utilicé el código de ejemplo en el enlace anterior mi propia aplicación para enviar un SMS, pero me encontré con un problema al verificar el estado de envío de mi mensaje. Lo que sucede es que aparecerá el mensaje de brindis por cada mensaje que he intentado enviar. Entonces, básicamente, digamos que ya envié 3 mensajes. Cuando voy a enviar mi 4º mensaje, el mensaje de pan tostado aparecerá 4 veces. Parece que quizás el BroadcastReceiver está recibiendo la misma transmisión de todos los intentos utilizados hasta ahora. No puedo entender exactamente por qué sucede esto o cómo detenerlo. ¡Cualquier ayuda o idea será muy apreciada!

Aquí es el método específico que causa esto:

//---sends an SMS message to another device--- 
private void sendSMS(String phoneNumber, String message) 
{   
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(SENT), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(DELIVERED), 0); 

    //---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 

    //---when the SMS has been delivered--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
        break;       
      } 
     } 
    }, new IntentFilter(DELIVERED));   

    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);   
} 
+0

¿Puede publicar el código mínimo completo necesario para replicar el problema? –

+0

Editaré mi publicación original para incluir el método que causa el problema – John

Respuesta

9

En primer lugar, usted tiene un new BroadcastReceiver(){ cada vez que llame sendSMS, por lo que se acumulan, uno más cada vez que llame sendSMS. Puede agregar unregister(this); en la parte inferior de cada BroadcastReceiver pero lo mejor sería mover el receptor Broadcast fuera de esta función. Puede crear + registro una en onResume() y unregister en onPause().

En segundo lugar, leer este link

si alguna vez desea enviar datos junto con su pendingIntent que necesita para ayudar Android distinguir sus intenciones pendientes mejor ..
Por ej.

PendingIntent deliveredPI = PendingIntent.getBroadcast(this, uniqueIdPerSMS++, 
    new Intent(DELIVERED), PendingIntent.FLAG_CANCEL_CURRENT); 
+0

gracias, funcionó. – Atmaram

+0

Hola me enfrenté al mismo problema Tengo 1 receptor de difusión desde el que comencé 1 servicio que es para recibir mensajes de la bandeja de entrada. Después de ese servicio, envío esos mensajes al número en particular. Y para el mensaje de envío utilicé el mismo código que el anterior (publicado por John). Mi problema es que cuando envío un mensaje, el mensaje "SMS SENT" aparecerá continuamente. Entonces, ¿cómo puedo recibir eso solo una vez? – anddev

+0

funciona como encanto! gracias :) –

0

El simple esto es que utiliza un identificador único para cada deliveredPI, porque si no lo hace entonces androide considera todos los mismos y para todos los de SMS deliveredPi mostrará el resultado de uno cualquiera (no saben si es el primero o el último).

Cuestiones relacionadas