2012-09-03 694 views
11

我的工作在Android短信application.I可以使用下面的代码发送短信到单个联系人。写短信发送内容://短信/发送表

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

现在我想发送短信到multicontacts.Some建议使用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.如果我想向x和y发送短消息,那么如何写入sms/sent表。 如果我使用Loop,那么它将不会创建任何新的线程ID,因为发送地址x已经有线程ID 1,并且y已经有线程ID 2.所以在线程ID 1和2下列出的消息永远不会创建新的线程ID 。

我试图通过

values.put("thread_id", 33); 

但随后在新线程ID的邮件不会在默认的应用程序列出,但在我的应用程序manualy插入线程ID。

请帮我的朋友

编辑:我试着用0,然后读数生成的thread_id单,然后将这个thread_id,则接下来的短信,仍然没有工作。

+0

所以你想要一个单独的组合线程,即使已经有一个线程为1和2? – nandeesh

+0

@ Nandesh..yes..Native应用程序就像那个 – sarath

+0

线程正是这样,他们是基于一个单一的数字,你不能为2个数字定义一个新的线程。你将不得不自己创建应用程序并拥有自己的数据库如果你想以自己的方式 – nandeesh

回答

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插入您的短信。

有几件事要注意。

不要使用此threadId为任何99088808插入单一收件人的邮件,为每个新的thread_id或只是做一个insert不指定thread_id

此外,非常小心的builder.appendQueryParameter(...)一部分,确保关键是recipient而不是recipients,如果你使用recipients它仍然可以工作,但你总是会得到相同的thread_id和您的所有短信将在一个线程结束。

+0

@vikki ..谢谢你...让我检查 – sarath

+0

@vikki ....对于所有的对话,它只创建一个线程ID ..我的密钥只是收件人...我的代码片段是String [] recipients = to_nums.toArray(new串[to_nums.size()]);; (字符串收件人:收件人) { builder.appendQueryParameter(“收件人”,收件人); } – sarath

+0

我不认为你正在使用toArray,如果to_nums是一个字符串数组,然后只是迭代,你不需要将其转换为一个字符串[], – vikki

0

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

+0

嗨..我试图把values.put(“thread_id”,33);新的线程ID;此后,我可以列出组对话但默认的短信应用程序没有列出与新的threadid对话。 – sarath

+0

您是否使用内容解析器插入创建新线程并在消息中分配其ID? – tsmith

+0

下面的代码我用来插入组短消息。内容值value = new ContentValues(); values.put(“address”,mobNo); values.put(“body”,msg); values.put(“thread_id”,33); ():content:// sms/sent“),values); – sarath