2010-02-02 16 views
5

Istnieje wiele pytań o to, nie ma odpowiedzi pracują w mojej aplikacji :(Usuń SMS w Androidzie 1.5

muszę usunąć SMS od odbiornika, nawet jeśli użytkownik może go zobaczyć, ale to musi być usunięte programowo.

Jak mogę to zrobić?

najodpowiedniejszym Użyłem był następujący, ale to nie działa :(

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

Odpowiedz

9

Po refactoring mojego kodu Okazało się, że obok rozwiązanie działa:

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

Dziękujemy wszystkim za pomoc!

ps, ​​jeśli ten kod jest przydatny dla niektórych - pamiętaj, że złapanie (wyjątek) nie jest dobre.

+3

czy to usunąć pojedynczą wiadomość lub całą rozmowę? Dlaczego wiadomość SMS Sms wzięta jako parametr, gdy jej nie t użyte w dowolnym miejscu metody? –

2

Ten link może być przydatne

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

nie wdrożyły w pełni to sam, ale co ja wdrożyły działa

pamiętać, że nie jest w pełni udokumentowany i tak może się zmienić w przyszłych wersjach Androida

EDIT:

Oto sposób, w jaki obowiązuje Kodeks sobie:

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

} 


} 

Kod wykrywa zmiany w dostawcy treści SMS.

Jest to linia byłbyś zainteresowany, jeśli chcesz, aby usunąć wiadomość SMS

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

trzeba usunąć całą rozmowę, aby usunąć wiadomość SMS, że nie udało nam się po prostu usunąć ostatni wiadomość z rozmowy

+0

Dzięki! Jest przydatny, ale nie działa dla mnie :(Może to nie działa tylko w emulatorze ... nie mam pojęcia, co robić więcej ...:( – Dmytro

+0

Dodałem moją implementację powyższego kodu, w tym w jaki sposób mogę usunąć rozmowę SMS, może być użyteczna –

3

Jaka jest wartość deleteUri?

Czy jesteś pewny, że SMS został zapisany w lokalnej pamięci masowej przed próbą usunięcia go przez? Jeśli obsługujesz transmisję SMS_RECEIVED, nie można zagwarantować, że wiadomość SMS zostanie przetworzona przez natywną aplikację SMS jeszcze ...

Należy również zauważyć, że interfejs API dostawcy treści SMS nie jest publicznie udokumentowany przez system Android i może ulec zmianie w przyszłości. Ale jeśli celujesz tylko w Androida 1.5 (lub obecne urządzenia), możesz być w porządku.

+0

Mam przetestowane treści: // sms i treść: // sms/skrzynka odbiorcza Próbuję usunąć to z opóźnieniem co 5 sekund, aby zagwarantować, że jest zapisany w pamięci, przy okazji czytam go najpierw! drukuje w dziennikach również !, ale nie usuwa :( – Dmytro

+0

'content: // sms' wydaje się w porządku.Możesz zweryfikować w bazie danych SQLite, że wartości, które przechodzisz do zapytania, są takie same jak te przechowywane w bazie danych? Jak sprawdzić, czy wiadomość nie została usunięta? –

+0

Właściwie wprowadziłem zapytania opóźnienia dotyczące wyboru wiadomości, ale mogłem je zobaczyć w "Wiadomościach" przez Tak więc wiadomości zostały zapisane.Teraz to działa dobrze, mam napisane rozwiązanie znalazłem. – Dmytro

1

korzystać z tej i być szczęśliwy faceci

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, proszę formatowanie –

4

Wystarczy użyć tego prostego kodu w odbiorniku transmisji.

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