2010-02-02 12 views
5

Hay muchas preguntas al respecto, no hay respuestas están trabajando en mi solicitud :(Eliminar SMS en Android 1.5

que necesito para eliminar SMS desde un receptor, incluso si el usuario lo puede ver, pero deben ser removidos mediante programación.

¿Cómo puedo hacerlo?

el más adecuado que he utilizado fue el siguiente, pero no funciona :(

context.getContentResolver().delete(
       deleteUri, 
       "address=? and date=?", 
       new String[] { msg.getOriginatingAddress(), 
         String.valueOf(msg.getTimestampMillis()) }); 

Respuesta

9

Después de refactorización mi código He encontrado que la próxima solución funciona:

private int deleteMessage(Context context, SmsMessage msg) { 
    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); 
     } catch (Exception e) { 
     } 
    } 
    return count; 
} 

Gracias a todos por la ayuda!

ps si este código es útil para alguien, recuerde que catch (Exception) no es bueno.

+3

¿Esto elimina un solo mensaje o una conversación completa? ¿Por qué SmsMessage msg se toma como un parámetro cuando no es t usado en cualquier parte del método? –

2

Este enlace puede ser útil

http://blog.chinaunix.net/u/9577/showart_1850111.html

no he implementado totalmente yo mismo, pero lo que he implementado funciona

en cuenta que no está totalmente documentado y por lo tanto es probable que cambie en futuras versiones de Android

EDIT:

Aquí es la forma en que he implementado el código de mí mismo:

String url = "content://sms/"; 
     Uri uri = Uri.parse(url); 
     getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler)); 

     Uri uriSms = Uri.parse("content://sms/inbox"); 
     Cursor c = getContentResolver().query(uriSms, null,null,null,null); 

     Log.d("COUNT", "Inbox count : " + c.getCount()); 


} 

class MyContentObserver extends ContentObserver { 

    public MyContentObserver(Handler handler) { 

     super(handler); 

    } 

@Override public boolean deliverSelfNotifications() { 
    return false; 
    } 

@Override public void onChange(boolean arg0) { 
    super.onChange(arg0); 

    Log.v("SMS", "Notification on SMS observer"); 

    Message msg = new Message(); 
    msg.obj = "xxxxxxxxxx"; 

    handler.sendMessage(msg); 

    Uri uriSMSURI = Uri.parse("content://sms/"); 
    Cursor cur = getContentResolver().query(uriSMSURI, null, null, 
       null, null); 
    cur.moveToNext(); 
    String protocol = cur.getString(cur.getColumnIndex("protocol")); 
    if(protocol == null){ 
      Log.d("SMS", "SMS SEND"); 
      int threadId = cur.getInt(cur.getColumnIndex("thread_id")); 
      Log.d("SMS", "SMS SEND ID = " + threadId); 
      getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadId), null, null); 

    } 
    else{ 
     Log.d("SMS", "SMS RECIEVE"); 
     int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id")); 
     getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null); 
    } 

} 


} 

El código está a la escucha de los cambios en el proveedor de contenido de SMS.

Ésta es la línea que estaría interesado en si desea borrar un SMS

getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null); 

Tienes que eliminar toda una conversación para eliminar el SMS, no he sido capaz de eliminar sólo el último mensaje de una conversación

+0

Gracias! Es útil, pero no funciona para mí :(Tal vez no funciona solo en emulador ... no tengo idea de qué hacer más ...:( – Dmytro

+0

He agregado mi implementación del código anterior, que incluye cómo elimino una conversación SMS, puede ser útil –

3

¿Cuál es el valor de deleteUri?

¿Estás seguro de que el SMS se ha escrito en el almacenamiento local antes de que intentas eliminar? Si está manejando la transmisión SMS_RECEIVED, no está garantizado que el SMS haya sido procesado por la aplicación de SMS nativa aún ...

Además, me gustaría señalar que la API del proveedor de contenido SMS no está documentada públicamente por Android y podría estar sujeto a cambios en el futuro. Pero si solo tiene como objetivo Android 1.5 (o dispositivos actuales), entonces puede estar bien.

+0

, he probado contenido: // sms y contenido: // sms/inbox Estoy intentando eliminarlo con retraso cada 5 segundos para garantizar que se guarde en el almacenamiento, por cierto lo leí primero! imprime bien en los registros, pero no elimina :( – Dmytro

+0

'content: // sms' parece correcto. ¿Puedes verificar en la base de datos SQLite que el los valores que está pasando en la consulta son los mismos que los almacenados en la base de datos? ¿Cómo se verifica que el mensaje no se eliminó? –

+0

En realidad, hice las consultas de demora de la selección de mensajes, también pude verlos en "Mensajes" a través de aplicación de mensajería. Así que los mensajes se almacenaron. Ahora funciona bien, he publicado la solución que encontré. – Dmytro

1

utilizar este y ser individuos felices

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.telephony.SmsMessage; 
import android.widget.Toast; 
import android.net.Uri; 

public class SmsReceiver extends BroadcastReceiver { 

    private Handler mHandler = new Handler(); 
    private SmsMessage[] msgs; 
    private Context con; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Bundle bundle = intent.getExtras();   
     msgs = null; 
     String str = "";    

     if (bundle != null) 
     { 
      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]);     

       str += "SMS from " + msgs[i].getOriginatingAddress();      
       str += ":"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n"; 
      } 

      con = context; 

      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        deleteSMS();  
       } 
      }, 5000); 

      Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
     }       
    } 

    private void deleteSMS() 
    { 
     try 
     { 
      for (int i=0; i<msgs.length; i++) 
      { 
       con.getContentResolver().delete(Uri.parse("content://sms"), "address=? and date=?", new String[] {msgs[i].getOriginatingAddress(), String.valueOf(msgs[i].getTimestampMillis())});    
      } 
     } 
     catch (Exception ex) 
     { 
      Toast.makeText(con, "Error: " + ex, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
+0

omg, formateo por favor –

4

sólo tiene que utilizar el código simple en su receptor de radiodifusión.

try { 
     Uri uriSms = Uri.parse("content://sms/inbox"); 
     Cursor c = context.getContentResolver().query(
       uriSms, 
       new String[] { "_id", "thread_id", "address", "person", 
         "date", "body" }, "read=0", null, null); 

     if (c != null && c.moveToFirst()) { 
      do { 
       long id = c.getLong(0); 
       long threadId = c.getLong(1); 
       String address = c.getString(2); 
       String body = c.getString(5); 
       String date = c.getString(3); 
       if (message.equals(body) && address.equals(number)) { 
        // mLogger.logInfo("Deleting SMS with id: " + threadId); 
        context.getContentResolver().delete(
          Uri.parse("content://sms/" + id), "date=?", 
          new String[] { <your date>}); 
        Log.e("log>>>", "Delete success........."); 
       } 
      } while (c.moveToNext()); 
     } 
    } catch (Exception e) { 
     Log.e("log>>>", e.toString()); 
    } 
Cuestiones relacionadas