Obtener los sms que se enviaron

Estoy haciendo un programa que envía mensajes SMS en Android. Funciona bien enviar, pero tengo un pequeño problema para saber qué mensaje fue enviado. El siguiente código es la parte principal del código: Lee muchos mensajes de la cadena resp , espera un tiempo aleatorio y envía cada uno de ellos. Pero, no sé por qué SMS está confirmando el método onReceive .

Entonces, esta es mi pregunta: ¿cómo puedo saber qué mensajes de SMS están confirmando onReceive? Intenté buscar las variables y los métodos de los dos argumentos context y intent , pero no me ayudó.

¡Gracias!

 final PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT"),0);
 registerReceiver(new BroadcastReceiver() {

//executed when the sms is sended
 public void onReceive(Context context, Intent intent) {
      switch(getResultCode()){
           case Activity.RESULT_OK:
                Toast.makeText(getApplicationContext(), "SMS sended",
                        Toast.LENGTH_LONG).show();
           break;
           default:
                Toast.makeText(getApplicationContext(), "Error",
                        Toast.LENGTH_LONG).show();
           break;
      }
 }
 }, new IntentFilter("SMS_SENT"));

//resp is a String with a number and a body by line: <body>\n<body>\n...
 final Scanner scan = new Scanner(resp);        
 String to;
 String body;
 SmsManager sms = SmsManager.getDefault();

 while (scan.hasNext()){
      long r = new Random().nextInt(20000) + 1000;
      synchronized(this){
           try {
                this.wait(r);
           } catch (InterruptedException e) {
                Toast.makeText(getApplicationContext(), "ERROR on WAIT",Toast.LENGTH_LONG).show();
           }
      }
      to = scan.next();
      body = scan.nextLine();
      Toast.makeText(getApplicationContext(), "Sending to " + to,
                Toast.LENGTH_LONG).show();

      sms.sendTextMessage(to, null, body, pi, null);
 }
 scan.close();
0

1 Respuestas

EDITAR: modificó ligeramente el código para poder guardar el BroadcastReceiver con el propósito de anular el registro

Puedes hacer esto agregando "extras" al Intención que pasas a PendingIntent.getBroadcast() o codificando el ID del mensaje en la "ACTION" que pones en el Intención que pasas a getBroadcast() .

Usar "extras" es más complicado debido a la forma en que se manejan los extras en PendingIntent s. Aquí hay un ejemplo de lo que quiero decir con la codificación del ID del mensaje en la ACCIÓN:

long messageID = ...;//This is the message ID (some unique value so that you know which message was sent)
String actionString = "SMS_SENT_" + messageID;

final PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent(actionString),0);
BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {

   //executed when the sms is sended
    public void onReceive(Context context, Intent intent) {
       //Extract message ID from action
        String action = intent.getAction();
        long id = -1;//Message ID
        if (action != null) {
            id = Long.parseLong(action.substring(9));
           //id is now your message ID
        }
        switch(getResultCode()){
           case Activity.RESULT_OK:
                Toast.makeText(getApplicationContext(), "SMS sended",
                    Toast.LENGTH_LONG).show();
           break;
           default:
                Toast.makeText(getApplicationContext(), "Error",
                    Toast.LENGTH_LONG).show();
           break;
        }
    }
};
registerReceiver(myBroadcastReceiver, new IntentFilter(actionString));
// Here you can save myBroadcastReceiver somewhere (in an ArrayList maybe?)
//  so that you can unregister later
0
agregado
Parece genial. Ya tengo una identificación única para cada mensaje de texto, porque todos los mensajes están en una base de datos ... ¿Entonces, necesitaré un PendingIntent para cada mensaje de texto? Lo intentaré y regresaré para darle un comentario. Gracias.
agregado el autor Hilder Vitor Lima Pereira, fuente
hay algo extraño ... ¿Necesito registrar uno onReceive para cada SMS? No está funcionando correctamente. El primer onReceive se ejecuta, pero la aplicación "muerta" antes de ejecutar los demás ... ¿Alguna idea? Gracias de nuevo.
agregado el autor Hilder Vitor Lima Pereira, fuente
Ok, creo que es un problema con la "espera" ...
agregado el autor Hilder Vitor Lima Pereira, fuente
¿Sabe de todos modos para anular el registro de un receptor (la operación inversa del registerReceiver )? Porque creo que puedo ahorrar memoria haciéndolo, porque realmente registro muchos receptores (uno para cada mensaje ...)
agregado el autor Hilder Vitor Lima Pereira, fuente
Por supuesto. Puede anular el registro del receptor de la misma manera. Deberá guardar una referencia al BroadcastReceiver que creó y luego, cuando desee cancelar el registro, simplemente llame a unregisterReceiver (myBroadcastReceiver) . Edité mi respuesta para mostrar cómo hacer esto.
agregado el autor David Wasser, fuente