@Mike M. e eu encontrei um problema com a resposta aceita (veja nossos comentários):
Basicamente, não faz sentido passar pelo loop for se não estivermos concatenando a mensagem de várias partes a cada vez:
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
msg_from = msgs[i].getOriginatingAddress();
String msgBody = msgs[i].getMessageBody();
}
Observe que acabamos de definir msgBody
o valor da string da parte respectiva da mensagem, independentemente do índice em que estamos, o que torna inútil todo o ponto de percorrer as diferentes partes da mensagem SMS, uma vez que ela será ajustada último valor do índice. Em vez disso, devemos usar +=
, ou como Mike observou, StringBuilder
:
Em suma, eis a aparência do meu código de recebimento de SMS:
if (myBundle != null) {
Object[] pdus = (Object[]) myBundle.get("pdus"); // pdus is key for SMS in bundle
//Object [] pdus now contains array of bytes
messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); //Returns one message, in array because multipart message due to sms max char
Message += messages[i].getMessageBody(); // Using +=, because need to add multipart from before also
}
contactNumber = messages[0].getOriginatingAddress(); //This could also be inside the loop, but there is no need
}
Basta colocar essa resposta no caso de alguém ter a mesma confusão.