2013-02-27 157 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