【发布时间】:2011-05-17 09:38:30
【问题描述】:
我有一个应用程序,它必须监听特定的 SMS。到目前为止很容易。
但是当我收到消息时,它是多部分的。有没有合适的方法将 SMS 作为一条消息接收?
现在我的活动开始了两次,针对短信的每个部分。我应该手动连接短信吗?
【问题讨论】:
-
这似乎是一个愚蠢的问题,但有没有办法将收听的消息缩短到 160 个字符以下?
我有一个应用程序,它必须监听特定的 SMS。到目前为止很容易。
但是当我收到消息时,它是多部分的。有没有合适的方法将 SMS 作为一条消息接收?
现在我的活动开始了两次,针对短信的每个部分。我应该手动连接短信吗?
【问题讨论】:
看看gTalkSMS 如何处理传入的短信可能会很有用,因为它似乎可以正确处理多部分消息。
【讨论】:
// There can be multiple SMS from multiple senders那里读到了这一行,这怎么可能?一个广播中来自多个发件人的多条短信?
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) {
}
【讨论】:
更短的解决方案:
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());
}
}
}
【讨论】:
是的,您应该手动连接 SMS,但显然您不想为每个消息段启动一个新活动。
我建议将您的活动的launchMode 属性设置为singleTask 或singleInstance,这样就不会发生这种情况。
或者让Service 接收您的短信,只有在收到完整消息后才会启动新的Activity。
【讨论】:
我不知道有一种方法可以一次性接收多部分消息。但是,如果您有正确的意图过滤器设置,则您只能获得 一个 用于多于 一个 SMS 的意图。事实上,Intent 可以包含来自不同发件人的短信和/或零个或多个多部分短信。
你可以试试这个方法:
在 Manifest 中添加一个带有意图过滤器 android.provider.Telephony.SMS_RECEIVED 的 SmsReceiver 类。
类 onReceive 方法将获得一个带有 pdu 包的意图。这些 pdu 可以来自不同的发件人,和/或在多部分文本消息的情况下,可以有更多来自同一发件人的 pdu,您必须将它们连接起来。
【讨论】: