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

时间:2010-11-29 16:58:48

标签: android sms

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

但是当我收到消息时,它是多部分的。是否有正确的方式将SMS作为一条消息接收?

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

5 个答案:

答案 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属性设置为singleTasksingleInstance,以免发生这种情况。

或者,Service收到您的短信,只有在收到完整邮件后才会启动新的Activity

答案 4 :(得分:1)

我不知道有一种方法可以将多部分消息作为一次。但是,如果您拥有正确的意图过滤器设置,那么只有一个意图才能获得一个短信。实际上,Intent可以包含来自不同发件人的短信和/或零或多个多部分短信。

您可以尝试这种方法:

在Manifest中添加一个带有intent-filter android.provider.Telephony.SMS_RECEIVED的SmsReceiver类。

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