Estoy desarrollando una aplicación de SMS de negocios. En esta aplicación, si un mensaje entrante proviene de un número en particular, digamos 999999999, debe ir a la bandeja de entrada de la aplicación y no a la bandeja de entrada nativa predeterminada. Todos los demás mensajes deben ir a la bandeja de entrada nativa del teléfono. ¿Cómo hago esto?¿Cómo evitar que los SMS vayan a la bandeja de entrada en Android?
Respuesta
Cuando SMS es recibido por el sistema Android, difunde un ordered broadcastIntent
con la acción "android.provider.Telephony.SMS_RECEIVED"
. Todos los receptores registrados, incluida la aplicación de SMS predeterminada del sistema, reciben este Intent
en orden de priority
que se estableció en su intent-filter
. El orden para receptores de radiodifusión con la misma prioridad no está especificado. Cualquier BroadcastReceiver
podría evitar que cualquier otro receptor de difusión registrado reciba la emisión usando abortBroadcast()
. receptor
Por lo tanto, todo lo que necesita es transmitido de esta manera:
public class SmsFilter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle extras = intent.getExtras();
if (extras != null) {
Object[] pdus = (Object[])extras.get("pdus");
if (pdus.length < 1) return; // Invalid SMS. Not sure that it's possible.
StringBuilder sb = new StringBuilder();
String sender = null;
for (int i = 0; i < pdus.length; i++) {
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
if (sender == null) sender = message.getOriginatingAddress();
String text = message.getMessageBody();
if (text != null) sb.append(text);
}
if (sender != null && sender.equals("999999999")) {
// Process our sms...
abortBroadcast();
}
return;
}
}
// ...
}
}
Parece que la aplicación de procesamiento de SMS por defecto del sistema utiliza la prioridad de 0
, lo que podría intentar 1
para que su solicitud sea antes. Añadir estas líneas a su AndroidManifest.xml
:
<receiver android:name=".SmsFilter">
<intent-filter android:priority="1">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
No se olvide de los permisos necesarios:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
Por cierto, se pueden encontrar todos los receptores registrados y sus prioridades utilizando este código:
Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
List<ResolveInfo> infos = context.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
for (ResolveInfo info : infos) {
System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
}
Actualización: Como FantasticJamieBurn said below, a partir de Android 4.4, la única aplicación que puede interceptar SMS (y bloquear si así lo desea) es la aplicación de SMS predeterminada (seleccionada por el usuario). Todas las demás aplicaciones solo pueden escuchar los SMS entrantes si la aplicación de SMS predeterminada no lo bloquea.
Véase también SMS Provider en las API de Android 4.4.
Respuesta absolutamente brillante y muy bien explicada, funcionó para mí. Gracias. –
Esto no parece funcionar con Android OS> = 4.3 –
Sí Se puede hacer
public void onReceive(Context context, Intent intent)
{
Bundle bundle=intent.getExtras();
Object[] messages=(Object[])bundle.get("pdus");
SmsMessage[] sms=new SmsMessage[messages.length];
Toast.makeText(context, "Hello", 1).show();
for(int n=0;n<messages.length;n++){
sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]);
}
for(SmsMessage msg:sms){
if(msg.getOriginatingAddress().endsWith(number))
{
SMS.updateMessageBox("\nFrom: "+msg.getOriginatingAddress()+"\n"+
"Message: "+msg.getMessageBody()+"\n");
/*((SMS) context).delete();*/
abortBroadcast();
}
}
}
sólo tiene que utilizar abortbroadcast() después de recibir en aplicación
Con el lanzamiento de Android 4.4 KitKat (API de nivel 19), la opción de bloquear un SMS mensaje y evitar que se entregue a la aplicación de SMS predeterminada se ha eliminado. Las aplicaciones de SMS no predeterminadas pueden observar los mensajes SMS a medida que se reciben, pero cualquier intento de cancelar la transmisión será ignorado por Android 4.4+.
Si tiene una aplicación existente que se basa en abortar las transmisiones de mensajes SMS, entonces puede considerar el impacto que tendrá este cambio en el comportamiento cuando los usuarios actualicen a Android 4.4+.
http://android-developers.blogspot.co.uk/2013/10/getting-your-sms-apps-ready-for-kitkat.html
También he encontrado que esto no funciona en 4.3 también. –
Comprobar el número del remitente es igual al número móvil de su teléfono el envío de SMS.
reemplazar la siguiente línea de código del Sr. "androide pretoriana"
if (sender != null && sender.equals("999999999")) {
a
if (sender != null && sender.equals("YOUR SMS SENDING MOBILE NUMBER HERE")) {
más aún se puede dar una configuración para el usuario para añadir manualmente los sms enviando número si se quiere cambiar eso.
- 1. Android: ¿Enviar SMS y hacer que aparezca en la bandeja de entrada de SMS?
- 2. ¿Cómo eliminar todos los sms de la bandeja de entrada mediante programación en android?
- 3. Cómo acceder a la bandeja de entrada de sms desde javascript en android (phonegap)
- 4. ¿Cómo eliminar un SMS de la bandeja de entrada en Android mediante programación?
- 5. Android: ¿Recibe todos los sms enviados? (bandeja de salida)
- 6. Eliminar un sms de la bandeja de entrada
- 7. referencia a la bandeja de entrada adicional
- 8. Guardar/Crear MMS en la bandeja de entrada de Android
- 9. Clase 0 SMS (SMS flash) en Android
- 10. Iphone 4.0 = cómo leer SMS desde la bandeja de entrada del iPhone Programativamente
- 11. No se pueden evitar los SMS usando abortBroadcast()?
- 12. Diferenciar MMS y SMS a través de escuchas MMS/SMS en Android
- 13. Android 1.5: leer mensajes SMS
- 14. ¿Cómo analizar los SMS entrantes en Android?
- 15. ¿Cómo crear una aplicación de SMS en Android?
- 16. Cambiando el texto de los sms de Android
- 17. Buscar la bandeja de entrada de Bluetooth
- 18. ¿Cómo puedo asegurar que todos los resultados de la tarea ejecutiva de Ant vayan a stdout?
- 19. Encontrar argumentos que vayan con los métodos en C++ dll's
- 20. Cómo asegurarse de que se envíe un SMS en Android
- 21. lectura más rápida de la bandeja de entrada en Java
- 22. Contenido de Android SMS (contenido: // sms/enviado)
- 23. Android: evitar que la pantalla se apague
- 24. ¿Cómo abrir la bandeja de entrada predeterminada del correo desde el código de Android?
- 25. Administración de la bandeja de entrada (en Outlook)
- 26. pantalla SMS entrantes en Symbian
- 27. desactivar la notificación de SMS en Android
- 28. Recibir SMS en la aplicación de Android
- 29. Enviando SMS en Android
- 30. Cómo capturar el evento Ajax que actualiza periódicamente la bandeja de entrada de gmail
http://stackoverflow.com/questions/9123125/class-0-sms-flash-sms-on-android/9123172#9123172 – xDragonZ
@Tom Medely. Gracias. – nsm
Posible [duplicado] (http://stackoverflow.com/q/1741628/1050058) –