Android - 接收长短信(多部分)

问题描述 投票:0回答:5

我有一个应用程序,它必须监听特定的短信。到目前为止很容易。

但是当我收到消息时,它是多部分的。有没有一种正确的方法可以将短信作为一条消息接收?

现在我的活动针对短信的每个部分启动两次。我应该手动连接短信吗?

android sms
5个回答
22
投票

了解 gTalkSMS 如何处理传入的短信可能会很有用,因为它似乎可以正确处理多部分消息。


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) {

}

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());
                        }
                    }
                }

1
投票

是的,您应该手动连接短信,但显然您不想为每个消息段启动一个新活动。

我建议将 Activity 的

launchMode
属性设置为
singleTask
singleInstance
,这样就不会发生这种情况。

或者让

Service
接收您的短信,只有在收到完整消息后才会启动新的
Activity


1
投票

我不知道如何一次性接收多部分消息。但是,如果您有正确的意图过滤器设置,您只能获得一个多个一个短信的意图。事实上,意图可以包含来自不同发送者的短信和/或零个或多个多部分短信。

你可以尝试这个方法:

在清单中添加带有意图过滤器 android.provider.Telephony.SMS_RECEIVED 的 SmsReceiver 类。

类 onReceive 方法将获取带有 pdu 包的意图。这些 pdu 可以分别来自不同的发件人,和/或在多部分文本消息的情况下,可以有来自同一发件人的更多 pdu,您必须将其连接起来。

© www.soinside.com 2019 - 2024. All rights reserved.