2010-02-02 30 views
5

有很多我需要從一個接收器中刪除的短信,即使用戶能看到它的問題吧,沒有答案在我的應用程序:(刪除SMS 1.5

工作,但它必須被移除編程。

我該怎麼辦呢?

我已經使用了以下,但它不工作:(最適合

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

回答

9

重構我的代碼後,我發現下一個解決方案的工作原理:

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

謝謝大家的幫助!

ps如果這段代碼對某些人有用 - 請記住catch(Exception)不好。

+3

這是否刪除單個消息或整個會話?爲什麼SmsMessage msg作爲參數被帶入在方法中的任何地方使用? –

2

此鏈接可能是有用

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

我還沒有完全實現它自己,但我已經實現了工作

注意,它不完全記錄,因此很可能在Android的

的未來版本中改變

編輯:

這裏是我實現了自己的代碼的方式:

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

} 


} 

代碼偵聽SMS內容提供程序中的更改。

這是行,如果你想刪除短信

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

你要刪除的整個會話刪除的短信,我一直無法直接刪除,最後你會感興趣談話的訊息

+0

謝謝!它的有用,但它不適用於我:(也許它不工作只是在模擬器...我不知道該怎麼做更多...:( – Dmytro

+0

我已經添加了我的上面的代碼實現,包括我如何刪除一個短信交談,它可能是有用的 –

3

deleteUri的價值是多少?

您確定SMS已被寫入本地存儲之前您試圖刪除它嗎?如果您正在處理SMS_RECEIVED廣播,則不能保證短信將由原生短信應用處理...

另外,我會注意到短信內容提供商API未由Android公開記錄並可能在未來發生變化。但是,如果您只定位到Android 1.5(或當前設備),那麼您可能就沒問題。

+0

我tryed內容://短信和內容://短信/收件箱 我想刪除它延遲每5秒保證它保存在存儲中,順便說一句,我先讀它!它在日誌中打印好!但不刪除:( – Dmytro

+0

'content:// sms'似乎很好。你可以在SQLite數據庫中驗證你傳遞給查詢的值是否與存儲在數據庫中的值相同?你如何驗證郵件沒有被刪除? –

+0

其實我對郵件的選擇做了延遲查詢,我也可以在「Messages」中看到它們所以消息被存儲了,現在它工作正常,我發佈了我發現的解決方案 – Dmytro

1

使用這種和快樂的傢伙

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,請格式化 –

4

在廣播接收器只要使用這個簡單的代碼。

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