SMS reciben sin notificación
Quiero recibir un sms en mi aplicación, pero no quiero que mi Android muestre una notificación sobre ese evento. Algoritmo:
1) Recibir sms (está bien)
- KitKat para Android (API 19) - ¿Cómo escribir mensajes en SMS Content Provider, sin enviarlos, desde la aplicación no predeterminada?
- Clase 0 SMS (SMS flash) en Android
- Cómo acceder a la bandeja de entrada de sms desde javascript en android (phonegap)
- ¿Es BroadcastReceiver.onReceive llamado exactamente una vez por sms?
- Cómo obtener SMS de borrador en Android 6 Marshmallow
2) Si se trata de un sms con un formato de contenido especial (para mi aplicación), proceselo con mi aplicación y no muestre ninguna notificación.
3) Si se trata de un mensaje simple – no quiero procesarlo, por lo que debe mostrarse una notificación.
Intenté usar una emisión ordenada, pero no ayuda. En alguna parte leí que la emisión de SMS_RECEIVE no está ordenada, pero he visto algunas aplicaciones, que pueden recibir SMS sin notificar.
¿Alguien puede ayudarme o mostrarme la manera correcta de resolver este problema?
Gracias.
Actualizar: llamar a abortBroadcast () en boradcast no ayuda
- Cómo borrar db cuando la aplicación se desinstala en android
- Enviar SMS en android
- Android: determinar por qué no se pudo enviar SMS
- Cómo recibir sms de datos en dos puertos diferentes
- Iniciar una intención de mensaje SMS ya no funciona para el nuevo sistema operativo RAZR ICS de Droid
- Cómo recuperar la ubicación GPS a través de SMS
- BroadcastReceiver para SMS de varias partes
- Leer mensajes de entrada de un número determinado y mostrarlos en una actividad
Establecer prioridad en el filtro de intenciones // en el manifiesto
<intent-filter android:priority="100"> /*your receiver get high priority*/
// en el receptor de radiodifusión
if (keyword_match) { // Stop it being passed to the main Messaging inbox abortBroadcast(); }
Esto debería ser posible registrando su aplicación para recibir mensajes SMS y luego usar abortBroadcast () cuando detecte que su mensaje ha llegado. Usted dice que abortBroadcast () no funciona – el SMS es definitivamente manejado por su receptor de SMS?
Para cualquiera que quiera hacer esto, sigue leyendo …
Primero, declare el receptor SMS en su AndroidManifest.xml y asegúrese de que la aplicación tenga permiso para recibir mensajes SMS.
<receiver android:name="mypackage.SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> <uses-permission android:name="android.permission.RECEIVE_SMS" />
He aquí un ejemplo de código para manejar los mensajes SMS:
public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); Object[] pdus = (Object[])extras.get("pdus"); for (Object pdu: pdus) { SmsMessage msg = SmsMessage.createFromPdu((byte[])pdu); String origin = msg.getOriginatingAddress(); String body = msg.getMessageBody(); // Parse the SMS body if (isMySpecialSMS) { // Stop it being passed to the main Messaging inbox abortBroadcast(); } } } }
No deberías hacer esto. Es posible que otras aplicaciones requieran o necesiten recibir la transmisión SMS_RECEIVED. Al interrumpirlo, se interrumpirá la ejecución de las aplicaciones de terceros. Esta es una mala forma de programar. Sólo debe abortar las emisiones que cree, no las transmisiones del sistema. No sé por qué el sistema operativo Android le permite hacer esto.
No estoy seguro de si sé exactamente lo que está tratando de hacer, pero a partir de lo que entiendo que sólo quiere saber cómo no enviar una notificación?
¿Por qué no puedes simplemente hacer:
If(instance 2){ //do your processing }else{ //send notification }
Si quiere decir que quiere bloquear el sistema operativo de la radiodifusión, entonces usted podría estar fuera de suerte porque no creo que usted puede hacer eso
Yo necesita android: atributo de prioridad para que funcione
<intent-filter android:priority="1"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter>
Usted está cometiendo un error, porque ha despedido abortBroadcast (); Si su mensaje especial para que el mensaje de difusión es abortado, por lo tanto, la notificación de SMS no se muestra, y sms no está guardando en la bandeja de entrada, usted tiene que hacer su propia notificación en "onRecive" si su mensaje especial se recibe. Ejemplo:
public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); Object[] pdus = (Object[])extras.get("pdus"); for (Object pdu: pdus) { SmsMessage msg = SmsMessage.createFromPdu((byte[])pdu); String origin = msg.getOriginatingAddress(); String body = msg.getMessageBody(); // Parse the SMS body if (isMySpecialSMS) { // Stop it being passed to the main Messaging inbox abortBroadcast(); NotificationManager notificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher, "New Message (My Messaging app)", System.currentTimeMillis()); // Uses the default lighting scheme notification.defaults |= Notification.DEFAULT_LIGHTS; // Will show lights and make the notification disappear when the presses it notification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS; Intent notificationIntent = new Intent(context, SplashActivity.class); PendingIntent pendingIntent =PendingIntent.getActivity(context, 0, new Intent(context, SplashActivity.class), 0); Log.i("Wakeup", "Display Wakeup"); PowerManager pm = (PowerManager)context.getApplicationContext().getSystemService(Context.POWER_SERVICE); WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Phone WakeUp"); wakeLock.acquire(); notification.setLatestEventInfo(context, "My Messaging App(New Message)",msg, pendingIntent); //notification.sound. notification.defaults |= Notification.DEFAULT_SOUND; notificationManager.notify(9999, notification); } else{ //Continue Broadcasting to main android app } } } }
Espero que esto solucione tu problema
- Loopj Android Async Http – onFailure no disparado
- Recupere la respuesta http en Retrofit antes de pasarla a la actividad de llamada