我有一个应用程序,它必须监听特定的短信。到目前为止很容易。
但是当我收到消息时,它是多部分的。有没有一种正确的方法可以将短信作为一条消息接收?
现在我的活动针对短信的每个部分启动两次。我应该手动连接短信吗?
了解 gTalkSMS 如何处理传入的短信可能会很有用,因为它似乎可以正确处理多部分消息。
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());
}
}
}
是的,您应该手动连接短信,但显然您不想为每个消息段启动一个新活动。
我建议将 Activity 的
launchMode
属性设置为 singleTask
或 singleInstance
,这样就不会发生这种情况。
或者让
Service
接收您的短信,只有在收到完整消息后才会启动新的 Activity
。
我不知道如何一次性接收多部分消息。但是,如果您有正确的意图过滤器设置,您只能获得一个多个一个短信的意图。事实上,意图可以包含来自不同发送者的短信和/或零个或多个多部分短信。
你可以尝试这个方法:
在清单中添加带有意图过滤器 android.provider.Telephony.SMS_RECEIVED 的 SmsReceiver 类。
类 onReceive 方法将获取带有 pdu 包的意图。这些 pdu 可以分别来自不同的发件人,和/或在多部分文本消息的情况下,可以有来自同一发件人的更多 pdu,您必须将其连接起来。