¿Cómo eliminar los Sms entrantes usando BroadcastReceiver?

He estado desarrollando la aplicación que puede administrar un dispositivo mediante comandos SMS; la aplicación debe ejecutar comandos desde SMS y eliminar este Sms. Entonces, el código para administrar funciona, pero no puedo eliminar el SMS. Tengo el siguiente BroadcastReceiver:

public class SmsReceiver extends BroadcastReceiver {

    private static final Uri SMS_INBOX_URI = Uri.parse("content://sms");

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String body = "";
        String number = "";

        Bundle bundle = intent.getExtras();
        SmsMessage[] msgs = null;
        if (bundle != null) {
            // ---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];
            for (int i = 0; i < msgs.length; i++) {
                msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                body += msgs[i].getMessageBody().toString();
                number +=msgs[i].getOriginatingAddress();
            }
        }

        SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(context);
        String key=prefs.getString(context.getString(R.string.acc_key_key), "");

        if (body.trim().equals("#"+key)) {
            sendGPSCoordinates(context, number);
        } else if (body.trim().equals("?"+key)){
            sendResponces(context);
        }
        deleteSms(body, number, context);
    }

    private void deleteSms(String body, String number, Context context) {

        ContentResolver resolver=context.getContentResolver();
        int count=resolver.delete(SMS_INBOX_URI, "body = ? AND address = ?", new String[]{body, number});
        Log.e("count", String.valueOf(count));
/*      Cursor results=resolver.query(SMS_INBOX_URI, null, null, null, null);
        for (String str:results.getColumnNames()) {
            Log.e("column", str);
        }
}

y tengo AndroidManifest.xml con los permisos necesarios. La aplicación recibe el SMS, obtiene los datos del SMS de un Intent, administra el teléfono e intenta eliminar este SMS, pero siempre devuelve el recuento igual a 0. He intentado cambiar el URI para sms/bandeja de entrada, pero no funciona. . Por favor, dime, ¿cómo puedo hacerlo? Gracias.

preguntado el 22 de mayo de 12 a las 11:05

Hola, ¿qué quieres? ¿Eliminar el nuevo mensaje entrante? esta no es la forma correcta de eliminar el mensaje. En lugar del número y el cuerpo, use la identificación para eliminar el mensaje. -

¡Hola amigo! ¿Pudiste eliminar el SMS o DETENER para recibir en la aplicación ingenua? Necesito ayuda con respecto a esto. -

3 Respuestas

Asumo, que usted sabe, que un mensaje SMS se envía según lo ordenado-Broadcast. Por lo tanto, su Receptor tiene la capacidad de obtenerlos ANTES de que la aplicación nativa de SMS los obtenga (simplemente establezca una prioridad más alta dentro del Manifiesto que la nativa). Por lo tanto, debería funcionar solo cancel la transmisión se envía, que el SMS nunca llega a la aplicación de sms nativa.

Podrías intentarlo así:

public class SmsReceiver extends BroadcastReceiver {

private static final Uri SMS_INBOX_URI = Uri.parse("content://sms");

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    String body = "";
    String number = "";

    Bundle bundle = intent.getExtras();
    SmsMessage[] msgs = null;
    if (bundle != null) {
        // ---retrieve the SMS message received---
        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];
        for (int i = 0; i < msgs.length; i++) {
            msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            body += msgs[i].getMessageBody().toString();
            number +=msgs[i].getOriginatingAddress();
        }
    }

    SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(context);
    String key=prefs.getString(context.getString(R.string.acc_key_key), "");

    if (body.trim().equals("#"+key)) {
        sendGPSCoordinates(context, number);
    } else if (body.trim().equals("?"+key)){
        sendResponces(context);
    }
    abortBroadcast();
}

contestado el 22 de mayo de 12 a las 12:05

gracias por responder. pero como puedo borrar el mensaje? Me dijiste que necesito abortar la transmisión, pero ¿qué piensas sobre borrar? - user1166635

Pensé que si aborta la transmisión de manera que la aplicación de SMS nativa nunca la reciba, tampoco tiene posibilidad de guardarla y, por lo tanto, no es necesario eliminarla. rafael t

tenga en cuenta: en la implementación anterior, se eliminarán CADA SMS que reciba su BroadcastReciever. solo cancele la transmisión si está seguro de que era 'su' SMS, porque de lo contrario NO se entregará ningún SMS - rafael t

@RafaelT - Hermano, ¿cuál es el R.string.acc_key_key ? - irfan aram

@Override
    public final void onReceive(final Context context, final Intent intent) {
        final String action = intent.getAction();
         Bundle extras = intent.getExtras();

            String messages = "";


            if ( extras != null )
            {
                // Get received SMS array
                Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );

                // Get ContentResolver object for pushing encrypted SMS to the incoming folder
               // ContentResolver contentResolver = context.getContentResolver();

                for ( int i = 0; i < smsExtra.length; ++i )
                {
                    SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);

                    String body = sms.getMessageBody().toString();
                    String address = sms.getOriginatingAddress();
                    long date = sms.getTimestampMillis();

}

después de esta consulta de escritura para obtener el último mensaje

y luego active su método de eliminación.

funciona bien para eliminar el último mensaje entrante.

Espero que puedas entenderlo.

contestado el 22 de mayo de 12 a las 12:05

Espero que esto te ayude...

@Override public void onReceive(Context context, Intent intent) {

    Bundle bundle = intent.getExtras();
    SmsMessage[] msgs = null;
    String number="";
    String Message="";      
    if (bundle != null)
    {
        //---retrieve the SMS message received---
        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];         
        for (int i=0; i<msgs.length; i++){
            msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);             
            number = msgs[i].getOriginatingAddress();  
            Message = Message + msgs[i].getMessageBody().toString();
        }
        //---display the new SMS message---
        Toast.makeText(context, number,Toast.LENGTH_LONG).show();
        Log.d("number:::", number);            
        PubVar.IN_SMS++;
        Savesms( number,Message,PubVar.PHONENO, context);
        long counted=deleteSMS(context);
        //long count=counted++;
        //PubVar.DELETED_SMS=counted;
        System.out.println("Deleted sms :"+ counted);
    }

}

//message deletion
private int deleteSMS(Context context)
{
    Uri deleteUri = Uri.parse("content://sms");
    int count = 0;
    Cursor c = context.getContentResolver().query(deleteUri, null, null,null, null);
    while (c.moveToNext()) 
    {
        try
        {
            // Delete the SMS

            String pid = c.getString(0); // Get id;
            String uri = "content://sms/" + pid;
            count = context.getContentResolver().delete(Uri.parse(uri), null, null);
            PubVar.DELETED_SMS=PubVar.DELETED_SMS+count;
        }
        catch (Exception e) 
        {
            System.out.println("error in deleting " + e.toString());
        }
    }
    c.close();

    return count;

}

Respondido el 19 de junio de 14 a las 09:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.