问题 将发送的短信写入内容:// sms / sent table


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

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

现在我想发送短信到multicontacts.Some建议使用loop.SO现在我使用循环发送短信到multicontact。

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

 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.如果我想将sms发送到x和y,那么我该如何写入sms / sent表。 如果我使用Loop,那么它将不会创建任何新的线程ID,因为发送地址x已经具有线程id 1并且y已经具有线程id 2.So消息将在线程id 1和2下列出从不创建新线程id。

我试图手动插入线程ID

values.put("thread_id", 33);

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

请帮帮我的朋友

编辑:我尝试使用0,然后读取生成的thread_id,然后使用此thread_id放置下一个短信,仍然无法正常工作。


10747
2017-09-03 07:49


起源

所以你想要一个单独的组合线程,即使已经有一个1和2的线程? - nandeesh
@ Nandesh..yes..Native app就是这样的 - sarath
线程就是这样,它们基于一个数字,你不能为2个数字定义一个新线程。你必须制作自己的应用程序并拥有自己的数据库,如果你想要的话 - nandeesh
本机应用程序就像那样......它们为组对话创建单独的线程ID - sarath
@ nandeesh ..我改变了我的问题。现在看看这个 - sarath


答案:


你需要创建一个新的 thread_id 手动,正常 contentResolver.insert(...) 不会对多个收件人邮件做。创造新的 thread_id 您查询以下uri

content://mms-sms/threadID

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

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

所以完整的例子看起来像这样。说收件人是 9808 和 8808

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或返回现有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 插入您的短信。

有几点需要注意。

不要用这个 threadId 为任一个插入单个收件人邮件 9908 要么 8808,为每个创建一个新的thread_id或只是做一个 insert 没有指定 thread_id

另外,要非常小心 builder.appendQueryParameter(...) 部分,确保关键是 recipient 并不是 recipients,如果你使用 recipients 它仍然可以工作,但你总会得到相同的 thread_id 并且所有的短信都将以一个帖子结束。


13
2017-09-19 07:57



@ vikki ..谢谢你...让我检查一下 - sarath
@vikki ....对于所有会话,它只创建一个线程ID ..我的密钥只是收件人...我的代码片段是String [] recipients = to_nums.toArray(new String [to_nums.size()]);; for(String recipient:recipients){builder.appendQueryParameter(“recipient”,recipient); } - sarath
我不认为你正在使用toArray,如果to_nums是一个字符串数组然后迭代你不需要将它转换为String [], - vikki
@Vikki ....对不起我的错误..现在它运作良好..再次感谢你.. :) - sarath
@Vikki ..看看这个问题请...stackoverflow.com/questions/12577036/... - sarath


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


0
2017-09-06 17:49



嗨..我试图通过values.put(“thread_id”,33)设置新的线程ID;之后我可以列出组会话,但默认的sms应用程序没有列出与新的threadid的会话。 - sarath
您是否使用内容解析器插件创建新线程并在消息中分配其ID? - tsmith
以下代码用于插入组sms ..ContentValues values = new ContentValues(); values.put(“address”,mobNo); values.put(“body”,msg); values.put(“thread_id”,33); getContentResolver()。insert(Uri.parse(“content:// sms / sent”),values); - sarath
是的,但是应该单独插入一个线程行,并检索它的id并作为线程Id插入。你应该有两个插入。 - tsmith
我检查.. - sarath