I'm reading SMS and MMS data from my Galaxy S6. All of the SMS messages have a date field like this 1456252633000. The number is the unix timestamp * 1000. The MMS messages that I sent (not received) have date fields like so: 1440628863 the timestamp is proper in unix time format. However, the MMS messages I receive have timestamp completely off, like this: 1454881665.
The two last timestamps above are consecutive, but the second one shows as though it's months before. Why is this so? Is there something I'm doing wrong here?
EDIT
I read this (How do the retrieve the date of the mms from content://mms.) and turns out that my issue is similar. The date is stuck in 1970. But even after converting it to milliseconds (1440185636 * 1000) I still get the wrong date...
EDIT 2
I'm trying to convert using the values as longs, however, still shows the date as months off.
For reference, it was 2/9/2016. I'm getting 8/26/2015 when I do the conversion. The reference timestamp is: 1440603051L * 1000L.
EDIT 3
Here is some code:
    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;
}
Previously I was doing:
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);
And I was getting the below error:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference