2010-11-29 19 views
22

У меня есть приложение, которое должно прослушать определенное SMS. До сих пор легко.Android - получение длинных SMS (multipart)

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

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

+0

Это может показаться глупым вопросом, но есть ли способ, чтобы укоротить послушали сообщения ниже 160 символов? – Phobos 2010-11-30 03:14:47

+1

nope;) не отправляйте меня. – Danail 2010-11-30 04:40:47

ответ

20

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

+2

Большое спасибо за ссылку, это было действительно полезно. Метод RetrieveMessages в ссылке - это то, что помогло мне собрать все многостраничные сообщения в одном. – 2015-05-01 12:46:34

1

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

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

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

1

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

Вы могли бы попробовать этот подход:

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

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

10
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()); 
         } 
        } 
       } 
Смежные вопросы