2010-02-02 7 views
5

Il y a beaucoup de questions à ce sujet, pas de réponses travaillent dans mon application :(Supprimer SMS dans Android 1.5

je supprimer SMS d'un récepteur, même si l'utilisateur peut le voir, mais il doit être retiré programme.

Comment puis-je le faire?

le plus approprié, je l'ai utilisé était le suivant, mais il ne fonctionne pas :(

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

Répondre

9

Après refactorisation mon code, je trouve que la solution suivante fonctionne:

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; 
} 

Merci à tous pour l'aide! Ps si ce code est utile pour quelqu'un - rappelez-vous que catch (Exception) n'est pas bon.

+3

est-ce que cela supprime un seul message ou une conversation entière? Pourquoi SmsMessage msg pris en paramètre quand son non t utilisé n'importe où dans la méthode? –

2

Ce lien peut être utile

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

Je ne l'ai pas pleinement mis en œuvre moi-même, mais ce que j'ai mis en œuvre fonctionne

Notez qu'il est pas complètement documenté et est donc susceptible de changer dans les futures versions d'Android

EDIT:

Voici la façon dont je me suis inséré le code:

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); 
    } 

} 


} 

Le code est à l'écoute des modifications apportées au fournisseur de contenu SMS.

Ceci est la ligne que vous seriez intéressé si vous souhaitez supprimer un SMS

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

Vous devez supprimer une conversation entière pour supprimer le SMS, je ne l'ai pas été en mesure de simplement supprimer la dernière message d'une conversation

+0

Merci! C'est utile, mais ça ne marche pas pour moi :(Peut-être que ça ne marche pas juste en émulateur ... je n'ai aucune idée de ce qu'il faut faire de plus ...:( – Dmytro

+0

J'ai ajouté mon implémentation du code ci-dessus y compris comment je supprime une conversation par SMS, il peut être utile –

3

Quelle est la valeur de deleteUri?

Etes-vous sûr que le SMS a été écrit dans le stockage local avant vous essayez de le supprimer? Si vous manipulez la SMS_RECEIVED diffusion, il est pas garanti que le SMS aura été traité par l'application SMS natif encore ...

En outre, je note que l'API de fournisseur de contenu SMS est pas publiquement documenté par Android et pourrait être sujet à changement dans le futur. Mais si vous ne ciblez que Android 1.5 (ou les appareils actuels), cela peut vous convenir.

+0

J'ai essayé le contenu: // sms et contenu: // sms/inbox J'essaie de le supprimer avec retard toutes les 5 secondes pour garantir qu'il est sauvegardé dans le stockage, btw je l'ai lu en premier! il imprime dans les journaux bien! mais ne supprime pas :( – Dmytro

+0

'content: // sms' semble bien.Pouvez-vous vérifier dans la base de données SQLite que le Les valeurs que vous passez dans la requête sont les mêmes que celles stockées dans la base de données Comment vérifier que le message n'a pas été supprimé? –

+0

En fait j'ai fait des requêtes de retard de sélection de messages aussi je pouvais les voir dans "Messages" via application de messagerie Ainsi, les messages ont été stockés.Maintenant cela fonctionne très bien, j'ai posté la solution que j'ai trouvé – Dmytro

1

utiliser ce gars et être heureux

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, formatage s'il vous plaît –

4

Il suffit d'utiliser ce code simple dans votre récepteur de radiodiffusion.

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()); 
    }