Страницы

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

среда, 24 октября 2018 г.

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

Пишу небольшое приложение, одна из функций - обработка сообщений.
Я взяла код получения 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(); } } }


Ответ

Опишу приблизительный алгоритм. Предположим есть некая строка 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
Надеюсь я смог Вам помочь в освоении этого непростого протокола.

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

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