在Android 1.5中删除短信

5

关于这个问题有很多疑问,但我的应用程序中没有任何答案可用 :(

我需要从接收器中删除短信,即使用户可以看到它,但必须以编程方式删除。

我该如何做呢?

我使用过的最合适的方法是下面的方法,但它不起作用 :(

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

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

提醒:不建议使用catch(Exception)

3
这个操作会删除单个消息还是整个聊天记录?为什么在该方法中把 SmsMessage msg 作为参数传入,但是却没有在方法中使用它? - Donal Rafferty

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

3
< p > < code >deleteUri 的值是什么?

您确定在尝试删除短信之前已将其写入本地存储器中吗? 如果您正在处理< code >SMS_RECEIVED 广播,不能保证短信已被原生短信应用程序处理...

此外,我要指出,Android没有公开文档化的短信内容提供者API可能会在未来发生变化。 但如果您只针对Android 1.5(或当前设备)进行定位,则可能没问题。


我已经尝试使用content://sms和content://sms/inbox。我正在尝试每5秒延迟删除它,以确保它已保存在存储中,顺便说一下,我先读取了它!它在日志中打印得很好!但是无法删除:( - Dmytro
content://sms 看起来没问题。您能否在 SQLite 数据库中验证您传递到查询中的值与存储在数据库中的值相同?您如何验证消息未被删除? - Christopher Orr
实际上,我制作了延迟查询的消息选择,也可以通过短信应用程序在“消息”中看到它们。因此,消息已被存储。现在它运行良好,我已经发布了我找到的解决方案。 - Dmytro

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

}


} 

该代码监听短信内容提供程序的更改。

如果您希望删除短信,则应关注此行。

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

您需要删除整个对话才能删除短信,我无法仅删除对话中的最后一条消息。

谢谢!这个很有用,但是对我来说不起作用 :( 也许只是在模拟器上不起作用...我不知道还能做什么了... :( - Dmytro
我已经添加了上面代码的实现,包括如何删除短信会话,这可能会有用。 - Donal Rafferty

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接