2013-02-27 34 views
11

Tôi muốn thêm một số tin nhắn MMS vào cơ sở dữ liệu điện thoại của mình.Android thêm MMS vào cơ sở dữ liệu

Tôi có mã sau nhưng không hoạt động. Không nhập được thêm vào ứng dụng bản địa ...

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 là quan điểm của tôi bối cảnh
  • to là một mảng chuỗi chứa địa chỉ (ví dụ. New String [] { "0612345678", "0623456789 "})
  • subject là chủ đề MMS của tôi, chẳng hạn như" Đã gửi qua MyApp "
  • messageUri là một Uri trỏ tới hình ảnh tôi muốn gửi trên thẻ SD của mình.

Tôi có làm sai không?

Trả lời

9

Cuối cùng tôi thấy làm thế nào để thực hiện công việc! Đây là mã tôi đã tạo.

Hãy cho tôi biết nếu bạn gặp một số vấn đề với điều này.

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 (ngữ cảnh, người nhận) ở đâu là phương pháp này? –

+0

lý do bạn gửi Uri dummySms = context.getContentResolver() chèn (Uri.parse ("content: // sms/sent"), dummyValues); –

+0

Rõ ràng, trên một số thiết bị (chạy 2.2-), nếu không có cuộc thảo luận với liên hệ đã cho, bạn cần chèn một tin nhắn SMS giả vào DB, sau đó chèn MMS của bạn và cuối cùng xóa sms giả. – Manitoba

0

bạn có thể muốn đọc "cách tải hình ảnh từ mms" trong liên kết sau. Lưu ý rằng nó đang sử dụng một bitmap để có được hình ảnh, chứ không phải là một ContentResolver.

thấy Here đi để trả lời chấp nhận, tìm kiếm chuỗi văn bản trên được in đậm

+0

Nếu bạn kiểm tra mã của mình, bạn sẽ thấy tôi đã theo chủ đề này theo cách ngược lại. Đoạn mã trên tạo ra một mục mới trong ứng dụng gốc, nhưng với một nội dung hoàn toàn trống. – Manitoba

Các vấn đề liên quan