2013-02-27 18 views
11

Ich möchte einige MMS-Nachrichten in meine Gerätedatenbank aufnehmen.Android MMS zur Datenbank hinzufügen

Ich habe den folgenden Code, aber es funktioniert überhaupt nicht. Kein Eintrag in die native App ...

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 ist meiner Ansicht nach Kontext
  • to ist ein String-Array, die Adressen enthalten (z. B. neue String [] { "0612345678", „0623456789 „})
  • subject ist mein MMS Thema wie‚über MeineAnw Sent‘
  • messageUri ist ein Uri auf das Bild verweist ich auf meine SD-Karte senden möchten.

Mache ich es falsch?

Antwort

9

bolded ist Schließlich fand ich, wie die Arbeit zu tun! Hier ist der Code, den ich gemacht habe.

Sagen Sie mir, wenn Sie Probleme damit haben.

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 (Kontext, Empfänger) Wo ist diese Methode? –

+0

Warum senden Sie Uri dummySms = context.getContentResolver(). Insert (Uri.parse ("content: // sms/sent"), dummyValues); –

+0

Offensichtlich, auf einigen Geräten (läuft 2.2-), wenn es keine Diskussion mit dem gegebenen Kontakt noch gibt, müssen Sie eine Dummy-SMS in DB einfügen, dann fügen Sie Ihre MMS ein und löschen Sie schließlich die Dummy-SMS. – Manitoba

0

möchten Sie vielleicht lesen ", wie Bild von mms bekommen" in den folgenden Link. Beachten Sie, dass es ein Bitmap verwendet, um das Bild statt eines ContentResolver zu erhalten.

siehe Here unterwegs akzeptierte Antwort, für Textzeichenfolge der Suche über das

+0

Wenn Sie meinen Code überprüfen, werden Sie sehen, dass ich diesem Thema in umgekehrter Reihenfolge gefolgt bin. Der obige Code erstellt einen neuen Eintrag in der nativen App, jedoch mit einem völlig leeren Inhalt. – Manitoba

Verwandte Themen