MMS日期是错误的

时间:2016-03-25 21:33:06

标签: android mms

我正在从Galaxy S6上阅读短信和彩信数据。所有短信都有一个date字段,如1456252633000。该数字是unix时间戳* 1000.我发送(未收到)的MMS消息的日期字段如下:1440628863时间戳以unix时间格式正确。但是,我收到的彩信时间戳完全关闭,如下所示:1454881665

上面的两个最后时间戳是连续的,但第二个时间戳显示好像是几个月之前。为什么会这样?我在这里做错了吗?

修改

我读了这篇文章(How do the retrieve the date of the mms from content://mms.),结果证明我的问题很相似。日期在1970年停滞不前。但即使将其转换为毫秒(1440185636 * 1000),我仍然得错了日期......

编辑2

我正在尝试使用值作为long进行转换,但仍然会将日期显示为月份。

供参考,是2016年2月9日。我正在进行转换时的8/26/2015。参考时间戳为:1440603051L * 1000L

编辑3

以下是一些代码:

    ContentResolver contentResolver = context.getContentResolver();
    Cursor c = contentResolver.query(Telephony.Mms.CONTENT_URI, null, filter, null, null);
    JSONArray array = new JSONArray();

    try {
        if (c.moveToFirst()) {
            do {
                try {
                    String[] cols = c.getColumnNames();
                    String id = c.getString(c.getColumnIndexOrThrow("_id"));
                    JSONObject msg = populateFromMmsPart(id);

                    if (msg != null) {
                        msg.put("id", id);
                        msg.put("read", c.getString(c.getColumnIndexOrThrow("read")).contains("1"));
                        msg.put("time", c.getString(c.getColumnIndexOrThrow("date")));
                        msg.put("m_id", c.getString(c.getColumnIndexOrThrow("m_id")));
                        msg.put("received", c.getString(c.getColumnIndexOrThrow("msg_box")).contains("1"));
                        msg.put("thread_id", c.getString(c.getColumnIndexOrThrow("thread_id")));

                        array.put(msg);
                    }

                } catch (JSONException j) {
                    j.printStackTrace();
                }
            } while (c.moveToNext());
        }
    } catch (Exception e) {
        e.printStackTrace();

    } finally {
        c.close();
    }

private JSONObject populateFromMmsPart(String msgId) {
    ContentResolver contentResolver = context.getContentResolver();
    Uri messages = Uri.parse("content://mms/part");
    Cursor c = contentResolver.query(messages, null, "_id=" + msgId, null, null);
    JSONObject msg = null;

    if (c.moveToFirst()) {
        try {
            String mid = c.getString(c.getColumnIndex("mid"));
            String type = c.getString(c.getColumnIndex("ct"));

            if (!"application/smil".equals(type)) {
                // Put all the addresses in one place
                msg = new JSONObject();
                msg.put("address", getAddressesForMmsMessages(mid));
                msg.put("mid", mid);
                msg.put("type", type);

                if ("text/plain".equals(type)) {
                    // MMS is just plain text, so get the text
                    String data = c.getString(c.getColumnIndex("_data"));
                    String body;
                    if (data != null) {
                        body = getMmsText(msgId);
                    } else {
                        body = c.getString(c.getColumnIndex("text"));
                    }
                    msg.put("msg", body);
                }
            }
        } catch (JSONException j) {
            j.printStackTrace();
        }
    }

    c.close();
    return msg;
}

以前我在做:

ContentResolver contentResolver = context.getContentResolver();
final String[] projection = new String[]{"*"};
Uri uri = Uri.parse("content://mms-sms/conversations/");
Cursor query = contentResolver.query(uri, projection, "thread_id=109", null, null);

我得到了以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

1 个答案:

答案 0 :(得分:1)

populateFromMmsPart()方法中,您要查询part表中_idmms表中的消息ID匹配的记录。但是,_id表中的part是部件的ID,而不是消息。邮件ID位于mid列中。当消息ID恰好与旧消息的部件ID匹配时,这显然会导致混淆。

按如下方式更改您的查询。

Cursor c = contentResolver.query(messages, null, "mid=" + msgId, null, null);

此外,在populateFromMmsPart()方法中,您只处理返回的Cursor的第一行。 Cursor将有(至少)三行。一个将是application/smil,一个将是text/plain,另一个将是附件的MIME类型。您需要迭代Cursor以获取所有内容。正如你现在所做的那样,你只需要调用c.moveToFirst()并处理那一行。