Android add MMS to database

寵の児 提交于 2019-12-03 12:12:56

问题


I want to add some MMS messages into my device database.

I've the following code but it doesn't work at all. No entry are added into the 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 is my view context
  • to is a string array containing the addresses (eg. new String[] {"0612345678", "0623456789"})
  • subject is my MMS subject such as "Sent via MyApp"
  • messageUri is an Uri pointing to the image I want to send on my SD card.

Am I doing it wrong ?


回答1:


Finally I found how to do the job ! Here is the code I made.

Tell me if you got some troubles with this.

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;
}



回答2:


you may want to read "how to get image from mms" in the following link. Note that it is using a bitmap to get the image , rather than a ContentResolver.

see Here go to accepted answer , searching for text string above that is bolded



来源:https://stackoverflow.com/questions/15114887/android-add-mms-to-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!