在Android 1.5中删除短信

时间:2010-02-02 11:37:11

标签: java android sms

关于它的问题很多,我的申请中没有答案:(

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

我该怎么做?

我使用的最合适的是以下内容,但它不起作用:(

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

5 个答案:

答案 0 :(得分: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)不好。

答案 1 :(得分: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());
    }

答案 2 :(得分:3)

deleteUri的价值是什么?

您确定在尝试删除之前已将SMS写入本地存储吗?如果您正在处理SMS_RECEIVED广播,则无法保证本地短信应用尚未处理短信...

此外,我会注意到Android内容提供商API未公开记录,并且可能会在将来发生变化。但是,如果你只针对Android 1.5(或当前的设备),那么你可能没问题。

答案 3 :(得分: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);

您必须删除整个会话以删除短信,我无法删除会话的最后一条消息

答案 4 :(得分: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(); 
        } 
    } 
}