2010-11-29 27 views
22

Ich habe eine Anwendung, die auf bestimmte SMS warten muss. So weit einfach.Android - Empfangen langer SMS (mehrteilig)

Aber wenn ich die Nachricht erhalte, ist es mehrteilig. Gibt es eine ordnungsgemäße Möglichkeit, die SMS als eine Nachricht zu empfangen?

Jetzt beginnt meine Aktivität zweimal, für jeden Teil der SMS. Sollte ich die SMS von Hand verketten?

+0

Das ist wie eine dumme Frage zu sein scheint, aber ist es eine Möglichkeit, die auf unter 160 Zeichen für Nachricht abgehört zu verkürzen? – Phobos

+1

nein;) nicht von mir gesendet. – Danail

Antwort

20

Es kann nützlich sein zu sehen, wie gTalkSMS eingehende SMS behandelt, da es scheint, mehrteilige Nachrichten richtig zu behandeln.

+2

Vielen Dank für den Link, es war sehr hilfreich. Die RetrieveMessages-Methode in der Verknüpfung hat mir geholfen, alle mehrteiligen Nachrichten in einem zu sammeln. –

+0

Schade, dass die Verbindung jetzt tot ist – Armand

+0

@Armand: Link aktualisiert. –

1

Ja, Sie sollten die SMS manuell verketten, aber Sie möchten natürlich nicht für jedes Nachrichtensegment eine neue Aktivität starten.

Ich schlage vor, das Attribut launchMode Ihrer Aktivität auf singleTask oder singleInstance zu setzen, damit das nicht passiert.

Alternativ haben Sie Ihre SMS von einem Service erhalten, die eine neue Activity nur einmal starten, sobald es eine vollständige Nachricht hat.

1

Mir ist keine Möglichkeit bekannt, eine mehrteilige Nachricht als einmal zu erhalten. Aber wenn Sie das richtige Intent-Filter-Setup haben, erhalten Sie nur einen Intent für mehr als ein SMS. Tatsächlich kann die Absicht SMS von verschiedenen Sendern und/oder Null oder mehr multipart SMS enthalten.

Sie versuchen, diesen Ansatz könnten:

schreiben SmsReceiver Klasse mit Intent-Filter android.provider.Telephony.SMS_RECEIVED im Manifest.

Die Klassen onReceive-Methode erhalten eine Absicht mit einem Bündel von PDUs. Diese PDUs können jeweils von verschiedenen Sendern stammen und/oder es kann mehr pdus vom selben Sender sein, wenn eine mehrteilige Textnachricht verkettet werden soll.

10
Bundle bundle = intent.getExtras(); 
Object[] pdus = (Object[]) bundle.get("pdus"); 
      messages = new SmsMessage[pdus.length]; 
      for (int i = 0; i < pdus.length; i++) 
      { 
       messages[i] = 
        SmsMessage.createFromPdu((byte[]) pdus[i]); 
      } 

SmsMessage sms = messages[0]; 
try { 
    if (messages.length == 1 || sms.isReplace()) { 
    body = sms.getDisplayMessageBody(); 
    } else { 
    StringBuilder bodyText = new StringBuilder(); 
    for (int i = 0; i < messages.length; i++) { 
     bodyText.append(messages[i].getMessageBody()); 
    } 
    body = bodyText.toString(); 
    } 
} catch (Exception e) { 

} 
+3

Danke, funktioniert für mich. Irgendeine Idee, wie gut das in der Praxis funktioniert? Könnten die PDUs zum Beispiel in realen Netzwerken in falscher Reihenfolge erscheinen? Oder könnte der Empfänger einmal mit part1 ausgelöst werden und dann noch einmal mit part2? –

+3

Und wie wäre es mit mehreren Sendern: Wäre es möglich, dass ein einzelner Aufruf der onReceive() - Methode Nachrichten aus mehreren Quellen enthält? –

+0

Der obige Code ist voller Löcher. Die GSM-Spezifikation besagt, dass Sie nicht davon ausgehen sollten, dass PDUs nacheinander geliefert werden. Auch der Durchsatz für GSM-Nachrichten ist etwa 6 - 10/Minute, Sie haben ein Multipart, das mehr enthält (oder Sie erhalten mehrere Nachrichten auf einmal) der Operator wird Abstand und später erneut versuchen. – Lieuwe

3

Kürzere Lösung:

if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 
        Bundle bundle = intent.getExtras();   //---get the SMS message passed in--- 
        SmsMessage[] msgs = null; 

        if (bundle != null) { 
         //---retrieve the SMS message received--- 
         try { 
          Object[] pdus = (Object[]) bundle.get("pdus"); 
          msgs = new SmsMessage[pdus.length]; 
          String msgBody = ""; 
          String msg_from = ""; 
          for (int i = 0; i < msgs.length; i++) { 
           msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
           msg_from = msgs[i].getOriginatingAddress(); 
           msgBody += msgs[i].getMessageBody(); 
          } 

         } catch (Exception e) { 
    //       Log.d("Exception caught",e.getMessage()); 
         } 
        } 
       }