Android – ¿Crear SMS de la API despreciada de PDU?

Quiero crear una aplicación que se notifica cuando un SMS llega y procesa ese SMS, pero leyendo la referencia para la función createFromPdu , indica que:

Este método pronto será obsoleto y todas las aplicaciones que manejan mensajes SMS entrantes procesando la intención de difusión SMS_RECEIVED_ACTION ahora deben pasar el nuevo formato String extra de la intención en el nuevo método createFromPdu (byte [], String) que toma un parámetro de formato extra. Esto es necesario para decodificar correctamente la PDU en dispositivos que requieren soporte tanto para formatos 3GPP como 3GPP2 al mismo tiempo, como teléfonos GSM / CDMA y CDMA / LTE de modo dual.

Sin embargo, la función createFromPdu(byte[], String) falta en la documentación y el SDK.

¿Que debería hacer? Tengo que soportar estos teléfonos dual-sim dual-mode.

En resumen, utilice esto:

 SmsMessage smsMessage; if (Build.VERSION.SDK_INT >= 19) { //KITKAT SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent); smsMessage = msgs[0]; } else { Object pdus[] = (Object[]) bundle.get("pdus"); smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]); } 
  public void onReceive(Context context, Intent intent) { SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent); String format = intent.getStringExtra("format"); SmsMessage sms = msgs[0]; Log.v("TAG", "handleSmsReceived" + (sms.isReplace() ? "(replace)" : "") + " messageUri: " + ", address: " + sms.getOriginatingAddress() + ", body: " + sms.getMessageBody()); String message = sms.getMessageBody(); } 

Si desea crear un objeto SmsMessage desde pdu, puede usar el nuevo api

http://developer.android.com/reference/android/telephony/SmsMessage.html#createFromPdu (byte [], java.lang.String)

  SmsMessage sms2 = SmsMessage.createFromPdu(msgs[0].getPdu(),format); 

Usted no menciona la versión de Android que está apuntando, pero dada la fecha de la pregunta estoy asumiendo Jelly Bean 4.x.

En el momento de escribir esto, estamos en Lollipop MR1 y la nota de depreciación sobre el uso de createFromPdu con el parámetro de formato sigue en pie:

https://android.googlesource.com/platform/frameworks/opt/telephony/+/android-5.1.0_r3/src/java/android/telephony/SmsMessage.java

En lugar de utilizar esa API directamente, sin embargo, puede utilizar la API del proveedor de telefonía getMessagesFromIntent : http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android /provider/Telephony.java/#686

Ese método considera el formato PDU (y el ID de suscripción en Lollipop para dispositivos Multi SIM) y le proporciona una matriz de instancias de SmsMessage.

Un ejemplo de cómo se utiliza se puede ver en la aplicación MMS de Google:

https://android.googlesource.com/platform/packages/apps/Mms/+/master/src/com/android/mms/transaction/SmsReceiverService.java (ver handleSmsReceived )

createFromPdu(byte[]) está obsoleto de SDK_INT 23 por lo que tiene que utilizar

createFromPdu((byte[]) , format);

Aquí está mi código para recibir SMS entrantes

Estoy utilizando la clase SMSReceiver como una clase interna de una Activity .

Este es mi codigo de trabajo

 public class SamplaActivity extends BaseActivity { SMSReceiver otp; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); otp=new SMSReceiver(); ........ ........ } @Override protected void onResume() { super.onResume(); // register broadcast receiver IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(otp, filter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(otp); } private class SMSReceiver extends BroadcastReceiver { private Bundle bundle; private SmsMessage currentSMS; private String message; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { bundle = intent.getExtras(); if (bundle != null) { Object[] pdu_Objects = (Object[]) bundle.get("pdus"); if (pdu_Objects != null) { for (Object aObject : pdu_Objects) { currentSMS = getIncomingMessage(aObject, bundle); String senderNo = currentSMS.getDisplayOriginatingAddress(); message = currentSMS.getDisplayMessageBody(); Toast.makeText(OtpActivity.this, "senderNum: " + senderNo + " :\n message: " + message, Toast.LENGTH_LONG).show(); } this.abortBroadcast(); // End of loop } } } // bundle null } } private SmsMessage getIncomingMessage(Object aObject, Bundle bundle) { SmsMessage currentSMS; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String format = bundle.getString("format"); currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format); } else { currentSMS = SmsMessage.createFromPdu((byte[]) aObject); } return currentSMS; } } 
  • Android Broadcast Receiver para enviar mensajes SMS?
  • Envío de SMS mediante programación a varias personas obteniendo un error genérico
  • Cómo enviar y recibir mensajes SMS de datos
  • Envío de sms a varias personas en android
  • Permitir que el usuario que utiliza el navegador móvil para enviar el código de producto que quieren por SMS
  • Listín de SMS de Android para un número específico
  • Mover un mensaje a la bandeja de entrada desde la base de datos
  • Android: recibe SMS largos (multipart)
  • Envío de SMS a granel con el administrador de sms en android
  • Android: no recibe confirmación de envío de SMS en el emulador
  • Uso de SMS para verificar el número de teléfono de un dispositivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.