MMS查询仅返回已发送附件的邮件大小

d.m*_*ada 13 java database android mms

我目前正在查询Android sms/mms数据库以检索MMS收到和发送的所有邮件.一切正常,但我注意到m_size列只有已MMS发送(未收到)的消息的值.

这是查询:

final String[] projection = new String[]{ "*" };
Uri uri = Uri.parse("content://mms");
Cursor query = _activity.getContentResolver().query(uri, projection, null, null, null);
Run Code Online (Sandbox Code Playgroud)

使用这个,我能够检索消息的总字节数,但它当前正在返回null收到的MMS消息.

if (query.moveToFirst())
{
    do
    {
        // ...

        Integer size = query.getInt(query.getColumnIndex("m_size"));
    }
    while (query.moveToNext());
}
Run Code Online (Sandbox Code Playgroud)

而不必计算"data"该消息的列大小,是有什么错我的查询/任何理由m_size将返回nullMMS收到的消息(并且有一个有效图片附件)?

注意:不确定早期API中是否有任何更改,因为此API未记录.我目前正在使用API​​ 23在Nexus 5X上进行测试/开发.

fej*_*ejd 3

据我所知,您的查询没有任何问题。

m_size 可能为空的原因有多种。null 是创建表时该列的默认值,请参阅MmsSmsDatabaseHelper。默认 SMS 应用程序可能在保存 PDU 时调用PduPersister.persist ,并且消息大小插入此处。事实上,您已保留检索到的 PDU,但没有 m_size,这表明标头不包含该值。如果您有 root 设备,则可以使用 tcpdump 和 Wireshark 验证标头内容。我假设默认 SMS 应用程序正确地保留了 PDU 和部件,但您可以检查的一件事是收件箱中彩信的消息类型。检索彩信时,您将首先收到一个NOTIFICATION-IND,通知有彩信要下载,并且其中包含一些基本信息。这应该由默认应用程序保留。然后它应该下载完整的彩信并保留RETRIEVE-CONF。消息大小是NotificationInd的一部分。当 SMS 应用程序保留 RETRIEVE-CONF 时,它可能会覆盖/删除 NOTIFICATION-IND,并且 m_size 将丢失。要测试此功能,您可以禁用彩信自动下载(如果应用程序支持),或者仅禁用任何数据,因为通知将作为 WAP 推送消息传递。