studio for developer android sms deprecated android-6.0-marshmallow

for - download android 6.0 marshmallow



Android-¿Crear SMS a partir de API en desuso PDU? (5)

En resumen, usa 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]); }

Quiero crear una aplicación que reciba una notificación cuando llegue un SMS y lo procese, pero al leer la referencia para la función createFromPdu , indica que:

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

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

¿Qué tengo que hacer? Necesito soportar estos teléfonos de modo dual de doble simulación.


Lo siento por la respuesta tardía, pero puede ayudar de todos modos. Aparte de comprobar la versión de Android y si está por encima de M y extraer el formato de cantar. Yo sugeriría usar:

compile ''me.everything:providers-android:1.0.1''

Manifiesto

<uses-permission android:name="android.permission.READ_SMS" />

Y en tus codigos

public List<Sms> mySmses(Context context)throws Exception{ TelephonyProvider telephonyProvider = new TelephonyProvider(context); List<Sms> smses = telephonyProvider.getSms(TelephonyProvider.Filter.INBOX).getList(); if(smses.isEmpty()){ throw new Exception("No SMS found"); } return smses; }

Recuerde usar AsyncTask para obtener SMS (que consumen el método anterior) ya que esta es una operación de larga ejecución. Puede bloquear su aplicación (en cierta ocasión) si se ejecuta en el subproceso de la interfaz de usuario.

Esta biblioteca me ahorró tiempo. Espero que haga lo mismo con alguien.


No mencionas a qué versión de Android te diriges, pero dada la fecha de la pregunta, asumo que Jelly Bean 4.x.

Al momento de escribir esto, estamos en Lollipop MR1 y la nota de desaprobació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

Sin embargo, en lugar de usar esa API directamente, puede usar 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 de la PDU (y el ID de suscripción en los dispositivos Multi SIM de Lollipop) y le brinda una variedad de instancias de SmsMessage.

Un ejemplo de cómo se usa 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á en desuso desde SDK_INT 23, por lo que debe usar

createFromPdu((byte[]) , format);

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

Estoy usando la clase SMSReceiver como una clase de una Activity .

este es mi código 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; } }


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 la nueva api

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

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