【问题标题】:Write sent sms to content://sms/sent table将发送的短信写入 content://sms/sent 表
【发布时间】:2012-09-03 07:49:56
【问题描述】:

我正在开发一个 android 短信应用程序。我可以使用以下代码向单个联系人发送短信。

sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);

现在我想向多联系人发送短信。有人建议使用循环。所以现在我正在使用循环向多联系人发送短信。

发送每条短信后,我将这些值写入发送表。

 ContentValues values = new ContentValues();
    values.put("address", mobNo);
    values.put("body", msg);
    getContentResolver().insert(Uri.parse("content://sms/sent"), values); 

每个新地址都会创建一个新的线程 ID。 例如,如果我的接收者的地址是 x,那么线程 id 1,对于 y 线程 id 2。如果我想向 x 和 y 发送短信,那么我该如何写入 sms/sent 表。 如果我使用循环,那么它不会创建任何新的线程 id,因为发送地址 x 已经有线程 id 1 并且 y 已经有线程 id 2。所以消息将列在线程 id 1 和 2 下永远不会创建新的线程 id。

我尝试手动插入线程ID

values.put("thread_id", 33);

但是新线程 id 下的消息没有在默认应用程序中列出,而是在我的应用程序中。

请朋友们帮帮我

编辑:我尝试使用0,然后读取生成的thread_id,然后用这个thread_id放置下一条短信,仍然不起作用。

【问题讨论】:

  • 所以即使 1 和 2 已经有一个线程,你也想要一个单独的组合线程?
  • @Nandesh..yes..Native 应用就是这样工作的
  • 线程就是这样,它们基于一个数字,你不能为两个数字定义一个新线程。如果您想按照自己的方式制作自己的应用程序并拥有自己的数据库,则必须制作自己的应用程序
  • 原生应用就是这样工作的......他们为群组对话创建单独的线程 ID
  • @nandeesh..我改变了我的问题。现在看看这个

标签: android sms android-contentprovider


【解决方案1】:

您需要手动创建一个新的thread_id,普通的contentResolver.insert(...) 将无法处理多个收件人的消息。要创建新的thread_id,请查询以下 uri

content://mms-sms/threadID

并向其附加必要的收件人,以便最终看起来像这样

content://mms-sms/threadID?recipient=9808&recipient=8808

所以完整的例子看起来像这样。假设收件人是98088808

Uri threadIdUri = Uri.parse('content://mms-sms/threadID');
Uri.Builder builder = threadIdUri.buildUpon();
String[] recipients = {"9808","8808"};
for(String recipient : recipients){
    builder.appendQueryParameter("recipient", recipient);
}
Uri uri = builder.build();

现在您可以以正常方式查询uri,这将为您提供一个thread_id,您可以将其用于指定的收件人,如果一个不存在或返回一个现有的,它将创建一个新的ID。

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

现在使用threadId 插入您的短信。

有几点需要注意。

不要使用此threadId99088808 插入单个收件人消息,为每个收件人创建一个新的thread_id 或只执行insert 而不指定thread_id

另外,请注意builder.appendQueryParameter(...) 部分,确保密钥是recipient 而不是recipients,如果您使用recipients,它仍然可以工作,但您将始终得到相同的thread_id 和您的所有短信都将在一个线程中结束。

【讨论】:

  • @vikki..谢谢你...让我检查一下
  • @vikki....对于所有对话,它只创建一个线程 id..我的密钥仅是收件人...我的代码 sn-p 是 String[] recipients = to_nums.toArray(new String [to_nums.size()]);; for(字符串收件人:收件人){ builder.appendQueryParameter(“收件人”,收件人); }
  • 我认为你没有正确使用 toArray,如果 to_nums 是一个字符串数组,那么只需迭代你不需要将它转换为 String[],
  • @Vikki..看看这个问题请..stackoverflow.com/questions/12577036/…
【解决方案2】:

看起来您应该为群组消息创建一个新线程并将其插入到新线程以及各个线程中。

【讨论】:

  • 嗨..我试图通过 values.put("thread_id", 33);.. 之后我可以列出群组对话,但默认短信应用程序没有列出对话使用新的 threadid。
  • 您是否使用内容解析器插入创建了新线程并在消息中分配了其 ID?
  • 我用来插入组短信的以下代码..ContentValues values = new ContentValues(); values.put("地址", mobNo); values.put("body", msg);values.put("thread_id", 33); getContentResolver().insert(Uri.parse("content://sms/sent"), values);
  • 是的,但是应该单独插入一个线程行,并检索它的 id 并将其作为线程 ID 插入。你应该有两个插入。
  • 您好,我是单独做的。我可以查看新的对话。但是默认的短信应用程序没有显示对话..ContentValues values = new ContentValues(); values.put("地址", phoneNumber); values.put("body", message); values.put("thread_id", 99); getContentResolver().insert(Uri.parse("content://sms/sent"), values);.我做了两次
猜你喜欢
  • 2010-10-14
  • 2012-01-22
  • 1970-01-01
  • 2012-03-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多