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

2022-09-04 23:25:11

我目前正在查询数据库以检索接收和发送的所有消息。一切正常,但我注意到m_size列仅对已发送(未接收)的消息具有值。Android sms/mmsMMSMMS

下面是查询:

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

使用此功能,我能够检索消息的总字节数,但它当前正在为已接收的彩信返回。null

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

        Integer size = query.getInt(query.getColumnIndex("m_size"));
    }
    while (query.moveToNext());
}

无需计算邮件的列大小,我的查询是否有任何问题/任何原因为什么会返回已接收的邮件(并且具有有效的图像附件)?"data"m_sizenullMMS

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


答案 1

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

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


答案 2

推荐