我有一个应用程序,它必须侦听特定的SMS。到目前为止容易。
但是当我收到消息时,它是多部分的。是否有正确的方式将SMS作为一条消息接收?
现在我的活动开始两次,对于短信的每一部分。我应该手动连接短信吗?
答案 0 :(得分:22)
查看gTalkSMS如何处理传入的SMS'可能很有用,因为它似乎正确处理多部分消息。
答案 1 :(得分:11)
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) {
}
答案 2 :(得分:3)
更短的解决方案:
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());
}
}
}
答案 3 :(得分:1)
是的,您应该手动连接SMS,但显然您不希望为每个消息段启动新活动。
我建议您将活动的launchMode
属性设置为singleTask
或singleInstance
,以免发生这种情况。
或者,Service
收到您的短信,只有在收到完整邮件后才会启动新的Activity
。
答案 4 :(得分:1)
我不知道有一种方法可以将多部分消息作为一次。但是,如果您拥有正确的意图过滤器设置,那么只有一个意图才能获得一个短信。实际上,Intent可以包含来自不同发件人的短信和/或零或多个多部分短信。
您可以尝试这种方法:
在Manifest中添加一个带有intent-filter android.provider.Telephony.SMS_RECEIVED的SmsReceiver类。
onReceive方法类将获得一堆pdus的意图。这些pdu可以来自不同的发件人每个和/或在多部分文本消息的情况下可以有来自同一发件人的更多pdus,你必须连接。