android - 如何在 "content://sms/draft"中插入草稿后更新短信线程

标签 android sms android-contentresolver

我正在使用以下代码将草稿插入到 content://sms/draft

        ContentValues values = new ContentValues();
        values.put("address", receiver2);
        values.put("body", body2);
        values.put("date", String.valueOf(System.currentTimeMillis()));
        values.put("type", "3");
        values.put("thread_id", thread_id);
        getContentResolver().insert(Uri.parse("content://sms/draft"), values);

如果没有与上述地址的任何对话,thread_id 为 0,否则它是该线程的 id。

当我运行此代码时,草稿确实已保存,但 native 短信客户端(stock android 4.0.3)中的线程未更新为“草稿”[我可以看到草稿消息正文,但没有上面有“草稿”标签。我必须打开关闭线程,以便标记为已标记]。我在某处读到线程没有正确更新的问题。我怎样才能强制更新线程,以便它在所有客户端中显示正常?

编辑:

阅读您的回答后,我更新了一些代码,但问题仍然存在。我在下面添加了一个屏幕截图,因为当我写我的问题时我很匆忙并且不能写得足够清楚。

protected void save_draft(String[] recipients, String body) {
        Uri threadIdUri = Uri.parse("content://mms-sms/threadID");
        Uri.Builder builder = threadIdUri.buildUpon();
        for (String recipient : recipients) {
            builder.appendQueryParameter("recipient", recipient);
        }
        Uri uri = builder.build();
        Long thread_id = get_thread_id(uri);
        Log.d("thread_id", thread_id + " ");

        ContentValues values = new ContentValues();
        values.put("body", body);
        values.put("date", String.valueOf(System.currentTimeMillis()));
        values.put("type", 3);
        values.put("thread_id", thread_id);
        getContentResolver().insert(Uri.parse("content://sms/draft"), values);
        //^tried "content://sms/" as well, but got the same result
    }

    private Long get_thread_id(Uri uri) {
        long threadId = 0;
        Cursor cursor = getContentResolver().query(uri, new String[] { "_id" },
                null, null, null);
        if (cursor != null) {
            try {
                if (cursor.moveToFirst()) {
                    threadId = cursor.getLong(0);
                }
            } finally {
                cursor.close();
            }
        }
        return threadId;
    }

a busy cat

如您所见,我通过上面的代码制作的草稿旁边没有“草稿”标签。

最佳答案

我提出这个问题已经有一段时间了,但这里是答案:

首先,如前所述,“草稿”提示不会出现在 native SMS 应用程序上这一事实不应该打扰任何人。对此无能为力,这就是 Native SMS 应用程序的工作方式。特别是在应用程序启动时初始化缓存,保存包含草稿的线程的线程 ID。草稿缓存仅从应用程序本身更新,而不是从短信表中的实际更改更新

对于保存草稿部分,这里是一段正确保存草稿的代码:

   public static final Uri CONTENT_URI =
                Uri.parse("content://sms/draft");

   public static Uri addDraft(ContentResolver resolver,
            String address, String body, String subject,
            Long date,  long threadId) {
        ContentValues values = new ContentValues(6);

        values.put(ADDRESS, address);
        if (date != null) {
            values.put(DATE, date);
        }
        values.put(READ, Integer.valueOf(1));
        values.put(SUBJECT, subject);
        values.put(BODY, body);
        if (threadId != -1L) {
            values.put(THREAD_ID, threadId);
        }
        return resolver.insert(CONTENT_URI , values);
    }

注意:草稿消息可能包含也可能不包含消息收件人的地址。草稿保存在线程(一个线程可以包含多个收件人)

虽然短信数据库根本没有记录,但您可以从 AOSP 中获取 Telephony 类,看看如何添加/删除消息以及处理有关短信和彩信的各种任务。 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/provider/Telephony.java

关于android - 如何在 "content://sms/draft"中插入草稿后更新短信线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12838419/

相关文章:

Android - 如何将带有 ImageViews 的 CardViews 放入网格中

php - 我怎样才能得到一个电话号码,客户可以通过短信将信息发布到我的网站上?

android - ContentResolver 查询结果有奇怪的列

android - 在 Android 中使用小数值作为像素大小?

android - 为什么 logcat 没有显示任何内容?

Java OpenCV - 使用 knnMatch 和 findHomography 显示重复项

Android - sendTextMessage 消息未显示在 SMS 应用程序中

android - 从 Activity A 调用方法到 Activity B 时出错

android-imageview - 如何从 Firebase 存储检索图像并显示它?获取 "No content provider"错误

android - ContentResolver 是如何定位到对应的 ContentProvider 的?