Java 删除安卓1.5中的短信

Java 删除安卓1.5中的短信,java,android,sms,Java,Android,Sms,关于它有很多问题,我的应用程序中没有答案:( 我需要从接收器中删除SMS,即使用户可以看到它,但必须以编程方式删除它 我怎么做 我使用过的最合适的方法如下,但它不起作用:( 这个链接可能有用 我自己还没有完全实现它,但我已经实现的工作 请注意,它没有完整的文档记录,因此在未来的Android版本中可能会发生更改 编辑: 以下是我自己实现代码的方式: String url = "content://sms/"; Uri uri = Uri.parse(url);

关于它有很多问题,我的应用程序中没有答案:(

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

我怎么做

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


这个链接可能有用

我自己还没有完全实现它,但我已经实现的工作

请注意,它没有完整的文档记录,因此在未来的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);

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

删除URI的值是多少

在您尝试删除之前,您确定短信已写入本地存储吗?如果您正在处理收到的
SMS\u
广播,则无法保证本机短信应用程序会处理短信


另外,我要指出的是,Android没有公开记录SMS内容提供商API,将来可能会更改。但如果您只针对Android 1.5(或当前设备),那么您可能没问题。

在重构我的代码后,我发现下一个解决方案可以工作:

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)是不好的。

使用这段代码,做一个快乐的人

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(); 
        } 
    } 
}
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.os.Bundle;
导入android.os.Handler;
导入android.telephony.sms消息;
导入android.widget.Toast;
导入android.net.Uri;
公共类SmsReceiver扩展了BroadcastReceiver{
私有处理程序mHandler=新处理程序();
私人短信[]MSG;
私人语境;
@凌驾
公共void onReceive(上下文、意图)
{
Bundle=intent.getExtras();
msgs=null;
字符串str=“”;
if(bundle!=null)
{
Object[]pdus=(Object[])bundle.get(“pdus”);
msgs=新SMS消息[PDU.length];

对于(inti=0;i只需在广播接收器中使用此简单代码

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());
    }
试试看{
Uri Uri=Uri.parse(“content://sms/inbox");
游标c=context.getContentResolver().query(
浪漫主义,
新字符串[]{“\u id”、“线程id”、“地址”、“人”,
“日期”,“正文”},“读=0”,空,空);
如果(c!=null&&c.moveToFirst()){
做{
long id=c.getLong(0);
long threadId=c.getLong(1);
字符串地址=c.getString(2);
字符串体=c.getString(5);
字符串日期=c.getString(3);
如果(消息等于(正文)和地址等于(数字)){
//mLogger.logInfo(“删除id为:+threadId的短信”);
context.getContentResolver().delete(
解析content://sms/“+id),“日期=?”,
新字符串[]{});
Log.e(“日志>>>”,“删除成功……”);
}
}而(c.moveToNext());
}
}捕获(例外e){
Log.e(“Log>>>”,e.toString());
}

谢谢!它很有用,但对我不起作用:(也许它不适用于emulator…我不知道还需要做什么…:(我已经添加了上述代码的实现,包括如何删除短信对话,这可能有用,我已经尝试过了。)content://sms 及content://sms/inbox 我尝试每5秒延迟删除一次,以确保它保存在存储器中,顺便说一句,我先读了它!它在日志中打印得很好!但不会删除:(
content://sms
看起来不错。您能在SQLite数据库中验证您传递到查询中的值是否与存储在数据库中的值相同吗?如何验证消息没有被删除?实际上,我对消息的选择进行了延迟查询,我也可以在“消息”中看到它们通过消息应用程序。因此消息被存储。现在它工作正常,我发布了我找到的解决方案。这会删除单个消息或整个对话吗?为什么在方法中的任何位置都不使用SmsMessage msg作为参数?
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());
    }