Hol dir die SMS, die gesendet wurden

Ich mache ein Programm, das SMS-Nachrichten auf Android sendet. Es funktioniert gut zu senden, aber ich habe ein kleines Problem zu wissen, welche Nachricht gesendet wurde. Der folgende Code ist der Hauptteil des Codes: Es liest viele Nachrichten aus der Zeichenkette resp , wartet eine zufällige Zeit und sendet jede von ihnen. Aber ich weiß nicht, welche SMS die Methode onReceive bestätigt.

Also, das ist meine Frage: wie kann ich wissen, welche der SMS sendeds das onReceive bestätigt? Ich habe versucht, nach den Variablen und Methoden der beiden Argumente context und intent zu suchen, aber es hat mir nicht geholfen.

Vielen Dank!

 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 Antworten

BEARBEITEN: Der Code wurde etwas modifiziert, um den BroadcastReceiver für die Aufhebung der Registrierung zu speichern

Sie können dies tun, indem Sie "Extras" zum Intent hinzufügen, den Sie an PendingIntent.getBroadcast() übergeben, oder indem Sie die Nachrichten-ID in der von Ihnen angegebenen "ACTION" codieren im Intent , den Sie an getBroadcast() übergeben.

Die Verwendung von "Extras" ist komplizierter, da die Extras in PendingIntent s behandelt werden. Hier ist ein Beispiel, was ich meine, indem ich die Nachrichten-ID in ACTION kodiere:

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
hinzugefügt
Scheint cool. Ich habe bereits eine eindeutige ID für jede SMS, da alle Nachrichten in einer Datenbank gespeichert sind ... Also brauche ich einen PendingIntent für jede SMS? Ich werde es versuchen und zurückkommen, um Ihnen ein Feedback zu geben. Vielen Dank.
hinzugefügt der Autor Hilder Vitor Lima Pereira, Quelle
Es gibt etwas Seltsames ... Ich muss für jede SMS ein onReceive registrieren. Es funktioniert nicht richtig. Das erste onReceive wird ausgeführt, aber die App "tot" bevor die anderen ausgeführt werden ... Eine Idee? Danke nochmal.
hinzugefügt der Autor Hilder Vitor Lima Pereira, Quelle
Ok, ich denke das ist ein Problem mit dem "Warten" ...
hinzugefügt der Autor Hilder Vitor Lima Pereira, Quelle
Weißt du trotzdem, einen Empfänger (den umgekehrten Vorgang des registerReceiver ) zu entfernen? Weil ich denke, dass ich Speicher sparen kann, weil ich tatsächlich viele Empfänger anmelde (einen für jede Nachricht ...)
hinzugefügt der Autor Hilder Vitor Lima Pereira, Quelle
Na sicher. Sie können den Empfänger auf die gleiche Weise abmelden. Sie müssen einen Verweis auf den BroadcastReceiver speichern, den Sie erstellt haben. Wenn Sie die Registrierung aufheben möchten, rufen Sie einfach unregisterReceiver (myBroadcastReceiver) auf. Ich habe meine Antwort bearbeitet, um zu zeigen, wie das geht.
hinzugefügt der Autor David Wasser, Quelle