Android: recibe SMS largos (multipart)

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

Pero cuando recibo el mensaje, es multiparte. ¿Hay una manera apropiada de recibir el SMS como un mensaje?

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

Puede ser útil mirar cómo gTalkSMS maneja SMS entrantes, ya que parece manejar correctamente mensajes multipart.

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 los SMS manualmente, pero obviamente no desea iniciar una nueva actividad para cada segmento de mensaje.

Le sugiero que establezca el atributo launchMode su actividad en singleTask o singleInstance para que eso no suceda.

De manera alternativa, los SMS recibidos por un Service , el cual activará una nueva Activity sólo una vez que tenga un mensaje completo.

No soy consciente de una manera de recibir un mensaje de varias partes como una vez. Pero si tiene la configuración de filtro de intención correcta, obtiene sólo 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 SMS de varias partes.

Usted podría intentar este acercamiento:

Agregue una clase SmsReceiver con el filtro de intenciones android.provider.Telephony.SMS_RECEIVED en el manifiesto.

Las clases onReceive Method obtendrán una intención con un paquete de pdus. Estos pdu pueden originarse de diferentes remitentes cada uno y / o puede haber más pdus del mismo remitente en el caso de un mensaje de texto de varias partes, que hay que concatenar.

  • BroadcastReceiver SMS_Received no funciona en nuevos dispositivos
  • Selecciona los primeros SMS en la bandeja de entrada de la base de datos de Android
  • Interceptar, leer y cancelar el mensaje SMS
  • ¿Cómo usar el proveedor de contenido de SMS? ¿Dónde están los documentos?
  • ¿Cómo leer el contenido del mensaje de un mensaje nuevo en el próximo mensaje en android?
  • ¿Necesito anular el registro de 'anonymous' BroadcastReceiver
  • Cómo crear BroadcastReceiver sin actividad
  • SmsManager.sendTextMessage no funciona
  • Android: apertura de la actividad de SMS con múltiples destinatarios especificados
  • Utilizar autocompletar texto con número de teléfono de contactos
  • La forma más rápida y rápida de obtener nuevos mensajes sms al iniciar la aplicación - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.