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.
- Cómo eliminar un SMS de la bandeja de entrada en Android mediante programación?
- Cómo obtener llamadas perdidas y recuento de SMS
- Cómo borrar db cuando la aplicación se desinstala en android
- Estructura de datos utilizada para mensajes SMS en Android
- Los teléfonos de Redmi no piden permisos de SMS y por lo tanto no leen sms
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.
- Eliminación de SMS de Android mediante programación
- ¿Cómo obtener el informe de entrega para el mensaje de texto enviado?
- ¿Es possilbe leer y / o modificar la cabecera de SMS en Android?
- Cómo configurar mi aplicación sms por defecto en Android Kitkat?
- Interceptar SMS recibido en Delphi XE5 para Android
- Android - Determinar el límite de texto SMS
- ¿Cómo puedo enviar sms falsos a mí mismo sin el uso de la red móvil?
- Android: escucha los mensajes SMS entrantes
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:
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 unaActivity
.
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; } }
- ¿Por qué android: singleLine = "true" hace el desplazamiento ListView muy laggy?
- ¿Cómo obtener el nombre y el apellido de los contactos de Android?