Подтвердить что ты не робот

Android - получение длинных SMS (multipart)

У меня есть приложение, которое должно прослушивать определенные SMS. До сих пор легко.

Но когда я получаю сообщение, оно размножается. Есть ли способ получить SMS как одно сообщение?

Теперь моя деятельность начинается два раза, для каждой части смс. Должен ли я конкатенировать SMS вручную?

4b9b3361

Ответ 1

Это может быть полезно посмотреть на то, как gTalkSMS обрабатывает входящие SMS'es, как представляется, правильно обрабатывать сообщения из нескольких частей.

Ответ 2

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

Ответ 4

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

Я предлагаю настроить атрибут Activity launchMode на singleTask или singleInstance, чтобы этого не произошло.

С другой стороны, ваше SMS-сообщение получено Service, которое будет запускать новый Activity только после того, как оно будет иметь полное сообщение.

Ответ 5

Я не знаю, как получить многостраничное сообщение как один раз. Но если у вас есть правильная настройка фильтра намерений, вы получаете только one Intent для более чем одного SMS. Фактически, Intent может содержать SMS от разных отправителей и/или ноль или более многостраничных SMS.

Вы можете попробовать этот подход:

Добавьте класс SmsReceiver с фильтром намерения android.provider.Telephony.SMS_RECEIVED в манифесте.

Классы onReceive Method получат намерение с пакетом pdus. Эти pdu могут происходить от разных отправителей каждый и/или могут быть больше pdus от одного и того же отправителя в случае многостраничного текстового сообщения, которое вы должны конкатенировать.