Почему делает ' SmsMessage.createFromPdu ' возвращает массив?



В Android, если я хочу прочитать входящее SMS, Я бы использовал SmsMessage.createFromPdu, но это возвращает массив SmsMessages. Почему это? Почему не просто один SmsMessage? Может быть, потому, что длинные сообщения можно разделить на несколько? Если да, то означает ли это, что я могу рассчитывать на то, что все эти SmsMessages будут иметь один и тот же исходный адрес?

496   2  

2 ответов:

После проведения тонны исследований, вот в чем дело:

Да, эти сообщения, которые вы получаете, - это разбитые части более крупного сообщения.

Массив SmsMessages содержит сообщения, которые могут быть или не быть связаны друг с другом (разные отправители). Почему Android их так смешивает? Я не знаю. Вы всегда должны перебирать их и группировать по SmsMessage.getDisplayOriginatingAddress(). Затем для каждой группы сообщений добавьте их тела из SmsMessage.getDisplayMessageBody(), чтобы восстановить более крупное сообщение.

Вот пример из источника приложения GTalk (спасибо @hungryghost):

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

Возвращает массив для поддержки сцепленных многосоставных SMS (для сообщений, длина которых превышает нормальное значение ~ 160 символов). Каждое сообщение может иметь или не иметь один и тот же исходный адрес в зависимости от того, используют ли они одну и ту же информацию заголовка.

Http://en.wikipedia.org/wiki/Concatenated_SMS

Http://en.wikipedia.org/wiki/Protocol_data_unit

Сообщение может быть не последовательным и может быть от разных отправителей. Взгляните на эти ссылки для обсуждение того, как объединить многосоставные SMS, включая хороший пример кода.

Обсуждение того, как обрабатывать многосоставные SMS

Gtalksms код для объединения PDU

Comments

    Ничего не найдено.