2012-02-07 7 views
15

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?

+0

http://stackoverflow.com/questions/9123125/class-0-sms-flash-sms-on-android/9123172#9123172 – xDragonZ

+0

@Tom Medely. Gracias. – nsm

+0

Posible [duplicado] (http://stackoverflow.com/q/1741628/1050058) –

Respuesta

1

¿Usted es el que envía los mensajes? Si es así, considere usar datos en su lugar ya que no aparecerán en la bandeja de entrada.

Comprobar this pregunta para obtener más información sobre cómo usarlo

+0

Gracias. Me ayudó mucho. – nsm

30

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.

+1

Respuesta absolutamente brillante y muy bien explicada, funcionó para mí. Gracias. –

+4

Esto no parece funcionar con Android OS> = 4.3 –

2

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

12

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

+0

También he encontrado que esto no funciona en 4.3 también. –

1

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.

Cuestiones relacionadas