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?
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?
Respuestas:
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:priority
atributo 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
1000
, por lo que es posible. De hecho, Handcent está usando prioridad 2147483647
.
"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."
.
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.
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.
/**
* 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.
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.