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

时间:2012-09-03 07:49:57

标签: android sms android-contentprovider

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

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

现在我想将短信发送到multicontacts。有人建议使用loop.SO现在我使用循环来发送短信到多触点。

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

 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放置下一个短信,仍然不起作用。

2 个答案:

答案 0 :(得分:13)

您需要手动创建新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 {1}}。

另外,对builder.appendQueryParameter(...)部分要非常小心,请确保密钥为recipient而不是recipients,如果您使用recipients它仍然有用,但您会总是得到相同的thread_id,所有的短信都会在一个帖子中结束。

答案 1 :(得分:0)

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