2010-11-29 60 views
22

我有一个应用程序,它必须听特定的短信。到目前为止容易。Android - 接收长短信(多部分)

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

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

+0

这似乎是一个愚蠢的问题,而是有没有办法缩短听了消息,低于160个字符? – Phobos 2010-11-30 03:14:47

+1

nope;)不由我发送。 – Danail 2010-11-30 04:40:47

回答

20

看看gTalkSMS如何处理传入的SMS可能是有用的,因为它似乎正确地处理多部分消息。

+2

非常感谢这个链接,这真的很有帮助。链接中的RetrieveMessages方法帮助我将所有多部分消息集中在一个中。 – 2015-05-01 12:46:34

1

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

我建议将您的活动的launchMode属性设置为singleTasksingleInstance以便不会发生。

或者您的短信由Service接收,只有当它有完整的信息时才会触发新的Activity

1

我不知道如何将一个多部分信息重新调用一次。但是,如果您拥有正确的意向过滤器设置,则只能获得一个意图超过一个 SMS。实际上,意图可以包含来自不同发件人的SMS和零个或多个多部分SMS。

你可以试试这个方法:

添加SmsReceiver类与清单android.provider.Telephony.SMS_RECEIVED意图过滤器。

onReceive方法的类将得到一个pdus包的意图。这些pdu可以来自不同的发送者,并且/或者在多部分文本消息的情况下可以来自同一个发送者的更多的pdus,您必须将它们连接起来。

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