2010-11-29 13 views
22

Tengo una aplicación, que tiene que escuchar SMS específicos. Hasta ahora es fácil.Android - recibir SMS largos (multiparte)

Pero cuando recibo el mensaje, es multiparte. ¿Hay una forma adecuada de recibir los SMS como un solo mensaje?

Ahora mi actividad comienza dos veces, para cada parte del sms. ¿Debo concatenar el SMS a mano?

+0

Esto puede parecer una pregunta tonta, pero ¿hay una manera de acortar la escuchó por debajo mensaje a 160 caracteres? – Phobos

+1

nope;) no enviado por mí. – Danail

Respuesta

20

Puede ser útil observar cómo gTalkSMS maneja los SMS entrantes, ya que parece manejar correctamente los mensajes de varias partes. solución

+2

Muchas gracias por el enlace, fue realmente útil. El método RetrieveMessages en el enlace es lo que me ayudó a recopilar todos los mensajes multiparte en uno. –

+0

Es una pena que el enlace esté ahora muerto – Armand

+0

@Armand: Enlace actualizado. –

1

Sí, debe concatenar el SMS a mano, pero obviamente no desea iniciar una nueva actividad para cada segmento de mensaje.

Sugiero establecer el atributo launchMode de su actividad en singleTask o singleInstance para que eso no suceda.

Como alternativa, sus mensajes de texto se han recibido por Service, que activará una nueva Activity solo cuando tenga un mensaje completo.

1

No conozco la forma de recibir un mensaje multiparte como una vez. Pero si tiene la configuración de filtro de intención correcta, obtiene solo una intención para más de un SMS. De hecho, el Intent puede contener SMS de diferentes remitentes y/o cero o más mensajes multiparte.

Usted podría intentar este enfoque:

Añadir una clase SmsReceiver con la intención filtro android.provider.Telephony.SMS_RECEIVED en el manifiesto.

Las clases en Método de recepción obtendrán un intento con un paquete de pdus. Estos pdu's pueden originarse de diferentes remitentes cada uno y/o pueden haber más pdus del mismo emisor en el caso de un mensaje de texto de varias partes, que debe concatenar.

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

Gracias, funciona para mí. ¿Alguna idea de lo bien que esto funciona en la práctica? ¿Podrían las PDU, por ejemplo, entrar en un orden incorrecto en redes reales? ¿O podría dispararse el receptor una vez con la parte 1, y luego otra vez con la parte 2? –

+3

¿Y qué hay de los múltiples remitentes: sería posible que una única llamada al método onReceive() contenga mensajes de múltiples fuentes? –

+0

El código anterior está lleno de agujeros. La especificación GSM dice que no debe suponerse que las PDU se entregan en secuencia. Además, el rendimiento de los mensajes GSM es de 6-10/minuto, si tiene una parte múltiple que contiene más (o si recibe varios mensajes a la vez), el operador se parará y lo intentará más tarde. – Lieuwe

3

Shorter:

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