2013-02-27 98 views
11

我想将一些彩信添加到我的设备数据库中。Android将彩信添加到数据库

我有下面的代码,但它根本不起作用。没有条目被添加到本机应用程序...

public static Uri insert(Context context, String[] to, String subject, Uri messageUri) 
{ 
    try 
    { 
     Uri destUri = Uri.parse("content://mms/sent"); 

     // Get thread id 
     Set<String> recipients = new HashSet<String>(); 
     recipients.addAll(Arrays.asList(to)); 
     long thread_id = getOrCreateThreadId(context, recipients); 
     Log.e(">>>>>>>", "Thread ID is " + thread_id); 

     // Create a dummy sms 
     ContentValues dummyValues = new ContentValues(); 
     dummyValues.put("thread_id", thread_id); 
     dummyValues.put("body", "Dummy SMS body."); 
     Uri dummySms = context.getContentResolver().insert(Uri.parse("content://sms/sent"), dummyValues); 

     // Create a new message entry 
     ContentValues mmsValues = new ContentValues(); 
     mmsValues.put("thread_id", thread_id); 
     mmsValues.put("date", System.currentTimeMillis()/1000); 
     mmsValues.put("ct_t", "application/vnd.wap.multipart.related"); 
     mmsValues.put("read", "1"); 
     mmsValues.put("sub", subject); 

     // Create part 
     long dummyId = System.currentTimeMillis(); 
     createPart(context, dummyId, imageBytes); 

     // Insert message 
     Uri res = context.getContentResolver().insert(destUri, mmsValues); 
     String messageId = res.getLastPathSegment().trim(); 
     Log.e(">>>>>>>", "Message saved as " + res); 

     // Update part 
     ContentValues updateValues = new ContentValues(); 
     updateValues.put("mid", messageId); 
     Uri updateUri = Uri.parse("content://mms/" + dummyId + "/part"); 
     int mmsPartRows = context.getContentResolver().update(updateUri, updateValues, null, null); 
     Log.e(">>>>>>>", "Part rows " + mmsPartRows); 

     // Create addresses 
     for (String addr : to) 
     { 
      ContentValues addrValues = new ContentValues(); 
      addrValues.put("address", addr); 
      addrValues.put("charset", "106"); 
      addrValues.put("type", 151); // TO 
      Uri addrUri = Uri.parse("content://mms/"+ messageId +"/addr"); 
      Uri mmsAddrUri = context.getContentResolver().insert(addrUri, addrValues); 
      Log.e(">>>>>>>", "Addr uri is " + mmsAddrUri.toString()); 
     } 

     res = Uri.parse(destUri + "/" + messageId); 

     // Delete dummy sms 
     context.getContentResolver().delete(dummySms, null, null); 

     return res; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 

private static Uri createPart(Context context, long id, byte[] imageBytes) throws Exception 
{ 
    ContentValues mmsPartValue = new ContentValues(); 
    mmsPartValue.put("ct", "image/png"); 
    Uri partUri = Uri.parse("content://mms/" + id + "/part"); 
    Uri res = context.getContentResolver().insert(partUri, mmsPartValue); 
    Log.e(">>>>>>>", "Part uri is " + res.toString()); 

    // Add data to part 
    OutputStream os = context.getContentResolver().openOutputStream(res); 
    ByteArrayInputStream is = new ByteArrayInputStream(imageBytes); 
    byte[] buffer = new byte[256]; 
    for (int len=0; (len=is.read(buffer)) != -1;) 
    { 
     os.write(buffer, 0, len); 
    } 
    os.close(); 
    is.close(); 

    return res; 
} 

private static long getOrCreateThreadId(Context context, String[] numbers) 
{ 
    HashSet<String> recipients = new HashSet<String>(); 
    recipients.addAll(Arrays.asList(numbers)); 
    return Telephony.Threads.getOrCreateThreadId(context, recipients); 
} 
  • context是我的视图上下文
  • to是包含地址的字符串数组(例如,新的String [] { “0612345678”,“0623456789 “})
  • subject是我的彩信主题,如‘内经MyApp的’
  • messageUri发送是一种开放的指向我想我的SD卡上发送图像。

我做错了吗?

回答

9

终于让我找到如何做的工作搜索文本字符串! 这是我所做的代码。

告诉我,如果你有这个麻烦。

public static Uri insert(Context context, String[] to, String subject, byte[] imageBytes) 
{ 
    try 
    {   
     Uri destUri = Uri.parse("content://mms"); 

     // Get thread id 
     Set<String> recipients = new HashSet<String>(); 
     recipients.addAll(Arrays.asList(to)); 
     long thread_id = getOrCreateThreadId(context, recipients); 
     Log.e(">>>>>>>", "Thread ID is " + thread_id); 

     // Create a dummy sms 
     ContentValues dummyValues = new ContentValues(); 
     dummyValues.put("thread_id", thread_id); 
     dummyValues.put("body", "Dummy SMS body."); 
     Uri dummySms = context.getContentResolver().insert(Uri.parse("content://sms/sent"), dummyValues); 

     // Create a new message entry 
     long now = System.currentTimeMillis(); 
     ContentValues mmsValues = new ContentValues(); 
     mmsValues.put("thread_id", thread_id); 
     mmsValues.put("date", now/1000L); 
     mmsValues.put("msg_box", MESSAGE_TYPE_OUTBOX); 
     //mmsValues.put("m_id", System.currentTimeMillis()); 
     mmsValues.put("read", 1); 
     mmsValues.put("sub", subject); 
     mmsValues.put("sub_cs", 106); 
     mmsValues.put("ct_t", "application/vnd.wap.multipart.related"); 
     mmsValues.put("exp", imageBytes.length); 
     mmsValues.put("m_cls", "personal"); 
     mmsValues.put("m_type", 128); // 132 (RETRIEVE CONF) 130 (NOTIF IND) 128 (SEND REQ) 
     mmsValues.put("v", 19); 
     mmsValues.put("pri", 129); 
     mmsValues.put("tr_id", "T"+ Long.toHexString(now)); 
     mmsValues.put("resp_st", 128); 

     // Insert message 
     Uri res = context.getContentResolver().insert(destUri, mmsValues); 
     String messageId = res.getLastPathSegment().trim(); 
     Log.e(">>>>>>>", "Message saved as " + res); 

     // Create part 
     createPart(context, messageId, imageBytes); 

     // Create addresses 
     for (String addr : to) 
     { 
      createAddr(context, messageId, addr); 
     } 

     //res = Uri.parse(destUri + "/" + messageId); 

     // Delete dummy sms 
     context.getContentResolver().delete(dummySms, null, null); 

     return res; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 

private static Uri createPart(Context context, String id, byte[] imageBytes) throws Exception 
{ 
    ContentValues mmsPartValue = new ContentValues(); 
    mmsPartValue.put("mid", id); 
    mmsPartValue.put("ct", "image/png"); 
    mmsPartValue.put("cid", "<" + System.currentTimeMillis() + ">"); 
    Uri partUri = Uri.parse("content://mms/" + id + "/part"); 
    Uri res = context.getContentResolver().insert(partUri, mmsPartValue); 
    Log.e(">>>>>>>", "Part uri is " + res.toString()); 

    // Add data to part 
    OutputStream os = context.getContentResolver().openOutputStream(res); 
    ByteArrayInputStream is = new ByteArrayInputStream(imageBytes); 
    byte[] buffer = new byte[256]; 
    for (int len=0; (len=is.read(buffer)) != -1;) 
    { 
     os.write(buffer, 0, len); 
    } 
    os.close(); 
    is.close(); 

    return res; 
} 

private static Uri createAddr(Context context, String id, String addr) throws Exception 
{ 
    ContentValues addrValues = new ContentValues(); 
    addrValues.put("address", addr); 
    addrValues.put("charset", "106"); 
    addrValues.put("type", 151); // TO 
    Uri addrUri = Uri.parse("content://mms/"+ id +"/addr"); 
    Uri res = context.getContentResolver().insert(addrUri, addrValues); 
    Log.e(">>>>>>>", "Addr uri is " + res.toString()); 

    return res; 
} 
+0

getOrCreateThreadId(context,recipients)这个方法在哪里? – 2013-04-08 06:27:05

+0

为什么要发送Uri dummySms = context.getContentResolver()。insert(Uri.parse(“content:// sms/sent”),dummyValues); – 2013-04-09 05:12:06

+0

显然,在某些设备上(运行2.2-),如果还没有与给定的联系人进行讨论,则需要在数据库中插入一个虚拟SMS,然后插入您的MMS,最后删除虚拟短信。 – Manitoba 2013-04-09 07:55:53

0

您可能想在下面的链接中阅读“如何从mms获取图片”。请注意,它使用位图来获取图像,而不是ContentResolver。

看到Here转到接受的答案,上面被加粗

+0

如果你检查我的代码,你会发现我已经以相反的方式跟踪了这个主题。上面的代码在本机应用程序中创建了一个新条目,但内容完全空白。 – Manitoba 2013-03-04 08:02:19