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?
- Observe los SMS que envían la aplicación en el emulador
- Registro de SMS como en la aplicación para móviles: whatsapp
- Cómo obtener lista de sms como convesations en cada dispositivo Android 2.2+
- Android: documentación para el contenido: // sms / "type" values?
- Android SmsProvider, ¿qué significa ICC?
Ahora mi actividad comienza dos veces, para cada parte del sms. ¿Debo concatenar el SMS a mano?
- Content: // sms / enviado / no funciona
- ¿Cómo enviar SMS usando Twilio en mi aplicación Android?
- Configuración única de Android SMS
- Opción para enviar sms utilizando Sim1 o Sim2 mediante programación
- SMS Broadcast Receiver no se llama en Android 6
- ¿Puedo enviar automáticamente SMS (sin la necesidad del usuario de aprobar)
- ¿Cuál es la longitud máxima de sms concatenados en smpp?
- Recibir SMS en la aplicación para Android
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.
- La notificación de Android no muestra su contenido cuando la aplicación no se está ejecutando
- Significado de color rojo en Nine-patch de Android