【问题标题】:Android - receiving long SMS (multipart)Android - 接收长短信(多部分)
【发布时间】:2011-05-17 09:38:30
【问题描述】:

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

但是当我收到消息时,它是多部分的。有没有合适的方法将 SMS 作为一条消息接收?

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

【问题讨论】:

  • 这似乎是一个愚蠢的问题,但有没有办法将收听的消息缩短到 160 个字符以下?

标签: android sms


【解决方案1】:

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

【讨论】:

  • 非常感谢您的链接,它真的很有帮助。链接中的 RetrieveMessages 方法帮助我将所有多部分消息收集到一个中。
  • 可惜链接已经失效了
  • 我在// There can be multiple SMS from multiple senders那里读到了这一行,这怎么可能?一个广播中来自多个发件人的多条短信?
【解决方案2】:
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) {

}

【讨论】:

  • 谢谢,为我工作。知道这在实践中效果如何吗?例如,PDU 在实际网络中的顺序是否错误?或者接收器可以先用 part1 触发一次,然后再用 part2 触发一次?
  • 那么多个发件人怎么样:一次调用 onReceive() 方法是否可以包含来自多个来源的消息?
  • 上面的代码漏洞百出。GSM规范说你不应该假设PDU是按顺序交付的。此外,GSM 消息的吞吐量约为 6 - 10 条 / 分钟,您有一个包含更多消息的多部分(或者您一次收到多条消息),操作员将暂停并稍后重试。
【解决方案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());
                        }
                    }
                }

【讨论】:

    【解决方案4】:

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

    我建议将您的活动的launchMode 属性设置为singleTasksingleInstance,这样就不会发生这种情况。

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

    【讨论】:

      【解决方案5】:

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

      你可以试试这个方法:

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-28
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多