首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么`SmsMessage.createFromPdu`返回一个数组?

为什么`SmsMessage.createFromPdu`返回一个数组?
EN

Stack Overflow用户
提问于 2014-06-12 01:11:37
回答 2查看 1.9K关注 0票数 4

在安卓系统中,如果我想读一条收到的短信,我会使用SmsMessage.createFromPdu,但这会返回一个SmsMessage的数组。为什么?为什么不只是一个SmsMessage呢?是不是因为长消息可以分成几个?如果是这样的话,这是否意味着我可以指望所有这些SmsMessage都有相同的起始地址?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-16 23:04:15

在做了大量的研究之后,我们达成了如下协议:

是的,你得到的这些信息是一条更大的信息的碎片。

SmsMessage的数组包含可能相互关联或不相关的消息(不同的发送方)。为什么Android会这样把他们混为一谈呢?我不知道。您应该始终循环遍历它们,并按SmsMessage.getDisplayOriginatingAddress()对它们进行分组。然后,对于每一组消息,从SmsMessage.getDisplayMessageBody()中追加它们的身体,以重构更大的消息。

下面是来自GTalk应用程序源的一个示例(谢谢@hungryghost):

代码语言:javascript
运行
复制
private static Map<String, String> RetrieveMessages(Intent intent) {
    Map<String, String> msg = null; 
    SmsMessage[] msgs;
    Bundle bundle = intent.getExtras();

    if (bundle != null && bundle.containsKey("pdus")) {
        Object[] pdus = (Object[]) bundle.get("pdus");

        if (pdus != null) {
            int nbrOfpdus = pdus.length;
            msg = new HashMap<String, String>(nbrOfpdus);
            msgs = new SmsMessage[nbrOfpdus];

            // There can be multiple SMS from multiple senders, there can be a maximum of nbrOfpdus different senders
            // However, send long SMS of same sender in one message
            for (int i = 0; i < nbrOfpdus; i++) {
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);

                String originatinAddress = msgs[i].getDisplayOriginatingAddress();

                // Check if index with number exists                    
                if (!msg.containsKey(originatinAddress)) { 
                    // Index with number doesn't exist                                               
                    // Save string into associative array with sender number as index
                    msg.put(msgs[i].getOriginatingAddress(), msgs[i].getDisplayMessageBody()); 

                } else {    
                    // Number has been there, add content but consider that
                    // msg.get(originatinAddress) already contains sms:sndrNbr:previousparts of SMS, 
                    // so just add the part of the current PDU
                    String previousparts = msg.get(originatinAddress);
                    String msgString = previousparts + msgs[i].getMessageBody();
                    msg.put(originatinAddress, msgString);
                }
            }
        }
    }

    return msg;
}
票数 3
EN

Stack Overflow用户

发布于 2014-06-12 01:46:00

它返回一个数组,以支持连接的多部分SMS (用于超过正常的~160字符限制的消息)。每个消息可以或不具有相同的起始地址,这取决于它们是否共享相同的报头信息。

短消息

单元

消息可能不符合顺序,可能来自不同的发送方。看看这些链接,讨论如何连接多部分SMS,包括一个好的代码示例。

浅谈如何处理多部分短信

连接pdus的gtalksms代码

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24175050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档