Android: recibe SMS largos (multiparte)

Tengo una aplicación, que tiene que escuchar SMS específicos. Hasta ahora es fácil.

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?

Puede ser útil observar cómo gTalkSMS maneja los SMS entrantes, ya que parece manejar mensajes multiparte correctamente.

 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) { } 

Solución más corta:

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

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

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

También puede recibir sus SMS de un Service , lo que activará una nueva Activity una vez que tenga un mensaje completo.

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

Podrías probar este enfoque:

Agregue una Clase SmsReceiver con intent-filter android.provider.Telephony.SMS_RECEIVED en el Manifiesto.

Las clases en Método de recepción obtendrán un bash 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.