¿Podemos eliminar un SMS en Android antes de que llegue a la bandeja de entrada?


100

Estoy eliminando un SMS de la bandeja de entrada, pero quiero saber: ¿Cómo puedo eliminarlo antes de que llegue a la bandeja de entrada?


2
¿Es j2ee realmente una etiqueta coincidente aquí?
jitter

1
¿Por qué java sería incorrecto si no lo programa en java en Android?
jitter

3
Esto apesta a maldad. No deberías estar haciendo esto.
MattC

43
¡Hay usos legítimos! Por ejemplo, si desea hacer algo (enviar ubicación GPS, borrar o algo) en su teléfono a través de SMS en caso de que sea robado; no quieres que quien robó el teléfono vea ese mensaje SMS.
políglota

21
¡Vamos gente! Esto definitivamente NO es "malvado" en absoluto. ¡@polyglot tiene razón! Estoy haciendo una aplicación para confirmar el número de usuario (como lo hace Viber) y lo necesito. Todo se puede usar como "malvado". No instale aplicaciones malvadas, solo eso.
Felipe

Respuestas:


187

Si.

A pesar de algunas reacciones negativas a esta pregunta, existen usos legítimos para la interceptación de SMS. Por ejemplo: automatización de la verificación del número de teléfono, servicios que se brindan a través de SMS (aunque generalmente esto debe hacerse con SMS de datos) o para aplicaciones que mejoran la experiencia del usuario procesando mensajes con formato especial para mostrarlos en un buen Android. -IU específica.

A partir de Android 1.6, las transmisiones de mensajes SMS entrantes ( android.provider.Telephony.SMS_RECEIVED) se entregan como una " transmisión ordenada ", lo que significa que puede decirle al sistema qué componentes deben recibir la transmisión primero.

Si define un android:priorityatributo en su escucha de SMS <intent-filter>, recibirá la notificación antes de la aplicación de SMS nativa.

En este punto, puede cancelar la transmisión, evitando que se propague a otras aplicaciones.


Actualización (octubre de 2013): cuando llegue Android 4.4, se realizarán cambios en las API de SMS que pueden afectar la capacidad de una aplicación para influir en la entrega de SMS.
Consulte esta publicación del blog de desarrolladores de Android para obtener más información:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html


13
Santo Dios. ¡Esto es verdad! ¡Siempre he asumido que sería al revés! Para pruebas, mire aquí . Guau. Ojalá pudiera darte más de un voto a favor;)
Hamy

1
@kakopappa: Sí, como se menciona en la respuesta, funciona desde Android 1.6+.
Christopher Orr

1
@herom Tengo aplicaciones que usan prioridad 1000, por lo que es posible. De hecho, Handcent está usando prioridad 2147483647.
Christopher Orr

2
Esto funcionó para mí para :) Mi aplicación captura el mensaje primero y no hay notificación, pero luego sms no llega a la bandeja de entrada de Mensajes. Como si nunca hubiera sido recibido, solo en mi aplicación. ¿Hay alguna forma de utilizar la transmisión de cancelación pero para recibir mensajes en la bandeja de entrada?
pandabear

7
Es importante tener en cuenta el nuevo nivel de API 19 como dice @ChristopherOrr en su actualización. Ahí dice "Beginning with Android 4.4—any attempt by your app to abort the SMS_RECEIVED_ACTION broadcast will be ignored so all apps interested have the chance to receive it.".
GoRoS

11

Paso 1: Cree su receptor de transmisión personalizado para recibir sms. escriba la lógica para abortar el más amplio para que el mensaje no esté disponible en su bandeja de entrada

public class SMSReceiver extends BroadcastReceiver
{
    public void onReceive(Context context, Intent intent)
    {
     if(conditionMatches){
     abortBroadcast();
     }
    }
}

Paso 2 Registre el receptor de transmisión en AndoridManifest y coloque android: valor de prioridad en un número grande

<receiver android:name=".SMSReceiver" >
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

Eso es

¿Cómo funciona el código anterior?

Como la recepción de SMS es una transmisión ordenada, el receptor con alta prioridad recibirá primero, por lo que su aplicación recibirá primero y, después de recibir, está cancelando la transmisión. Por lo que ninguna otra aplicación puede recibirlo. Por lo tanto, los sms no existirán en la bandeja de entrada.


¿Podemos tener un receptor de transmisión, cuando el usuario presiona la bandeja de entrada del mensaje, para que pueda desarrollar una pantalla de bloqueo?
Vamsi Pavan Mahesh

9

La siguiente solución ("android: priority" y abortBroadcast ()) funciona siempre que la aplicación de mensajería de Android esté predeterminada (me refiero a la aplicación de mensajería de Android estándar). Si el usuario instala "GoSMSPro" o "HandcentSMS", estas aplicaciones aún muestran mensajes en la bandeja de entrada, creo que esto se debe a "android: priority". No veo ninguna mejor manera de solucionar el problema anterior, si hay aplicaciones de mensajería de terceros instaladas en el teléfono.


2
Buen punto. Pero esto debería ser un comentario, no una respuesta. ¿Es posible moverlo? --- ¿y si le pones un valor muy alto? Como android: priority = "9999"? ¿por ejemplo? ¿Has probado eso?
Felipe

4
@FelipeMicaroniLalli en realidad GO SMS PRO, etc ... use 2147483647 para su prioridad
rf43

1
@DDoSAttack 2147483647 es el máximo?
Felipe

3
Es el entero sin firmar más grande en.wikipedia.org/wiki/Integer_(computer_science) el máximo que admite Android es 999. developer.android.com/reference/android/content/…
rf43

2
@NomanHamid Eso es correcto. 999 es la prioridad máxima. Puede usar el número que elija, aunque Android solo garantizará hasta 999. Cualquier cosa más grande que eso y puede o no ser inestable y tener consecuencias no deseadas. Personalmente, tuve que usar 2147483647 para intentar revisar aplicaciones como GO SMS PRO. A veces funcionó para los usuarios y otras no.
rf43

1
/**
 * Check priority
 * @param activity
 */
public static void receiverPriority(Activity activity){

    Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
    List<ResolveInfo> infos =  activity.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
    for (ResolveInfo info : infos) {
        System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
    }
}

Compruebe la prioridad y establezca una prioridad más alta (en su manifiesto) que otros receptores.


0

Si tiene un escenario como este y desea eliminar o ignorar el mensaje relacionado con este número de contacto "+ 44xxxxx", etc., utilice este código en el receptor de transmisión de SMS

 if(sender.equalsIgnoreCase("+44xxxxxx")
   this.abortBroadCast();

También debe configurarlo como alta prioridad.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.