Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Получение длинных SMS сообщений, разбитых на части, на Android

#java #android #sms


Пишу небольшое приложение, одна из функций - обработка сообщений.

Я взяла код получения sms сообщения. Всё работает, но при получении длинного sms
 оно разбивается на несколько частей. Нужно собрать все части одной sms в одну строку
и проверить что сообщение получено полностью.

Поиски вывели на несколько вариантов, но там создаётся массив в котором в качестве
ключа используется номер отправителя, это позволяет собрать все части сообщения в одну
строку, но не гарантирует получения всех частей sms.

Я изучала документацию по PDU но не смогла понять некоторые вещи. 


Как узнать разбито ли сообщение на части?
Как узнать количество частей?
Как узнать номер части обрабатываемой прямо сейчас?


Прошу вашей помощи.

public class SMSMonitor extends BroadcastReceiver {
    private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction() != null && ACTION.compareToIgnoreCase(intent.getAction())
== 0) {
            Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
            SmsMessage[] messages = new SmsMessage[pduArray.length];
            for (int i = 0; i < pduArray.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
            }
            StringBuilder bodyText = new StringBuilder();
            for (SmsMessage message : messages) {
                bodyText.append(message.getMessageBody());
            }
            String body = bodyText.toString();
            Observer.getInstance().send(new SmsEvent(body));
            abortBroadcast();
        }
    }
}

    


Ответы

Ответ 1



Опишу приблизительный алгоритм. Предположим есть некая строка pdu: 07919772929090F3440B919778563412F00008519042212124618C050003F50201041D043E0447044C002C00200443043B043804460430002C00200444043E043D04300440044C002C00200430043F04420435043A0430002C000A0411043504410441043C044B0441043B0435043D043D044B0439002004380020044204430441043A043B044B043900200441043204350442002E000A04160438043204380020043504490435 где: 07919772929090F3 - SCA 44 - ProtocolDataUnitType 0B919778563412F0 - OriginatorAdrress 00 - ProtocolIdentifier 08 - DataCodingScheme 51904221212461 - ServiceCenterTimeStamp 8C - UserDataLength 050003F50201 - UDHI 041D043E0447044C002C00200443043B043804460430002C00200444043E043D04300440044C002C00200430043F04420435043A0430002C000A0411043504410441043C044B0441043B0435043D043D044B0439002004380020044204430441043A043B044B043900200441043204350442002E000A04160438043204380020043504490435 - UserData так вот, то что вас интересует находится в UDHI:050003F50201 02 - это количество сообщений, 01 - порядковый номер. Определить, что есть UDHI внутри UserData можно по ProtocolDataUnitType - в нашем случае 44(Hex). Данную hex-строку переведем в байт и посмотрим значение 6 бита, если он равен 1, то тогда UserData содержит UDHI. Надеюсь я смог Вам помочь в освоении этого непростого протокола.

Комментариев нет:

Отправить комментарий