以编程方式删除Android短信

37

我想在我的Android应用程序中自动删除一些特定的短信。因此,我有一个方法可以完全做到我想要的。但是,只有当我直接从Eclipse将应用程序部署到我的手机时,它才能删除收到的短信。然而,如果应用程序是从市场下载的,则无法工作。但也没有错误。有人知道我怎样才能解决这个问题吗?或者这只适用于已root的设备吗?

public void deleteSMS(Context context, String message, String number) {
    try {
        mLogger.logInfo("Deleting SMS from inbox");
        Uri uriSms = Uri.parse("content://sms/inbox");
        Cursor c = context.getContentResolver().query(uriSms,
            new String[] { "_id", "thread_id", "address",
                "person", "date", "body" }, null, 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);

                if (message.equals(body) && address.equals(number)) {
                    mLogger.logInfo("Deleting SMS with id: " + threadId);
                    context.getContentResolver().delete(
                        Uri.parse("content://sms/" + id), null, null);
                }
            } while (c.moveToNext());
        }
    } catch (Exception e) {
        mLogger.logError("Could not delete SMS from inbox: " + e.getMessage());
    }
}

1
@Marclin,这两个问题是不同的。在这个问题中,如果短信直接从Eclipse部署,它会被删除,但如果从市场上下载则不会。 - Sunil Kumar Sahoo
@SunilKumarSahoo:你说得对。 代码完美运行,但仅当设备连接到PC时,如果从市场下载,则不起作用。 我正在努力理解为什么? - Florian
记得在使用完光标后关闭它。 - MikeL
@Florian - 你能否更新你的回答,加入你提到的 Handler。我将非常感激你。 - Irfan Akram
8个回答

34

实际上,我发布的代码是100%正确的。问题在于Android在接收短信后需要一些时间来存储该短信。因此,解决方案就是添加一个处理程序并将删除请求延迟1或2秒。

这实际上解决了整个问题。

编辑(感谢Maksim Dmitriev):

请注意,您无法在运行Android 4.4的设备上删除短信消息。

此外,系统现在只允许默认应用程序将消息数据写入提供程序,尽管其他应用程序随时可以读取。

http://developer.android.com/about/versions/kitkat.html

如果尝试删除,将不会抛出任何异常,并且不会删除任何内容。我刚在两个模拟器上测试过。

如何以编程方式发送短信消息


在Android 4.4中没有办法发送消息并且不显示在收件箱中吗? - محمد

16

天啊,我找了那么多小时。谢谢! - Basic Coder

10

使用以下代码自定义删除短信: 1. 按日期 2. 按号码 3. 按内容

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);
                Log.e("log>>>",
                        "0--->" + c.getString(0) + "1---->" + c.getString(1)
                                + "2---->" + c.getString(2) + "3--->"
                                + c.getString(3) + "4----->" + c.getString(4)
                                + "5---->" + c.getString(5));
                Log.e("log>>>", "date" + c.getString(0));

                ContentValues values = new ContentValues();
                values.put("read", true);
                getContentResolver().update(Uri.parse("content://sms/"),
                        values, "_id=" + id, null);

                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[] { c.getString(4) });
                    Log.e("log>>>", "Delete success.........");
                }
            } while (c.moveToNext());
        }
    } catch (Exception e) {
        Log.e("log>>>", e.toString());
    }

String date = c.getString(3); 第3个索引是person。 - Deepu
自KitKat 4.4版本开始,不允许插入、删除和更新(除非应用程序是默认的短信应用程序或设备已经获取了root权限)。这里有一个可能的解决方法:https://dev59.com/64bca4cB1Zd3GeqPWHUV#27709655,仅支持4.4版本。该安全漏洞已在Lollipop 5.1中修复。 - Keshan Fernando

4

在Android 4.4及以上版本中,您可以选择默认的短信应用程序。如果您的应用程序被设置为默认应用程序,则它将能够删除短信。


4

如何使应用成为默认应用程序 请参阅此处。 在删除之前,请检查您的应用程序是否是默认短信应用程序。 使用 telephony 类提供的 URI 而不是硬编码。

public void deleteSMS(Context context,int position)
{
    Uri deleteUri = Uri.parse(Telephony.Sms.CONTENT_URI);
    int count = 0;
    Cursor c = context.getContentResolver().query(deleteUri, new String[]{BaseColumns._ID}, null,
            null, null); // only query _ID and not everything
        try {
              while (c.moveToNext()) {
                // Delete the SMS
                String pid = c.getString(Telephony.Sms._ID); // Get _id;
                String uri = Telephony.Sms.CONTENT_URI.buildUpon().appendPath(pid)
                count = context.getContentResolver().delete(uri,
                    null, null);
              }
        } catch (Exception e) {
        }finally{
          if(c!=null) c.close() // don't forget to close the cursor
        }

   }

它会删除所有短信(收件箱、发件箱、草稿箱)。


仅使用 context.getContentResolver().delete(deleteUri, null, null); 是否也会删除所有短信? - Jānis Elmeris
此答案展示了如何通过_id删除单个短信,如果您知道_id,则无需查询所有内容,这只是为了参考。是的,您是正确的,如果您想删除所有短信,您的答案将起作用。 - Cyph3rCod3r

1
private int deleteMessage(Context context, SmsMessage msg) {
    Uri deleteUri = Uri.parse("content://sms");
    int count = 0;
            @SuppressLint("Recycle") 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;
}

请使用这段代码.............
或者
getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);

如果您仔细查看我的代码,您会发现这正是我正在做的事情。如果设备连接到PC并直接部署,我的代码可以完美运行。 - Florian

0

我正在寻找一种一键删除所有短信的方法。感谢这篇文章,我成功了。 如果有人感兴趣,这是我的方法:

    private void deleteSMS(){
    Uri myUri= Uri.parse("content://sms/");
    Cursor cursor = getContext().getContentResolver().query(myUri, null,null,null,null);
    while (cursor.moveToNext()) {
        int thread_id = cursor.getInt(1);
        getContext().getContentResolver().delete(Uri.parse("content://sms/conversations/" + thread_id),null,null);
    }
    cursor.close();
}

-1

如果你想收到一条信息,但你的Android手机上的短信应用没有发送任何通知,请使用二进制(数据)短信。


链接已失效,请检查URL。 - Amir Hajiha

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