2015-11-05 46 views
13

我目前正在查詢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); 

用這個,我能夠檢索消息的總字節數,但它目前正在返回null用於收到該彩信。

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

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

而不必計算消息的"data"列大小,是有什麼錯我的查詢/任何理由m_size將返回收到該nullMMS消息(並具有有效的圖片附件)?

注意:不確定在早期的API中是否有任何更改,因爲此API未記錄。我目前正在使用API​​ 23在Nexus 5X上進行測試/開發。

+0

只是FYI,我在Galaxy S4上運行KitKat(API 19),並且發送和接收的消息都有'm_size'值。 –

+0

@MikeM。有趣的是,感謝您的輸入。這可能是絕對有可能的,這可能會改變API 23。 –

回答

2

從我所看到的,您的查詢沒有任何問題。

m_size可能爲空有幾個原因。 null是創建表時該列的默認值,請參見MmsSmsDatabaseHelper。 當保存PDU時,默認的SMS應用可能會調用PduPersister.persist,並且消息大小被插入here。事實上,你已經持續檢索PDU但沒有m_size表明頭沒有包含這個值。如果你有一個根目錄的設備,你可以使用tcpdump和Wireshark驗證頭文件的內容。我假設默認的短信應用程序正確地持久保存了PDU和部件,但您可以檢查的一件事是收件箱中MMS的消息類型。當檢索彩信時,您首先會得到一個NOTIFICATION-IND,通知您有要下載的彩信,並且包含一些基本信息。這應該由默認應用持續。然後它應該下載完整的MMS並堅持RETRIEVE-CONF。郵件大小是NotificationInd的一部分。當SMS應用程序持續執行RETRIEVE-CONF時,它可能會覆蓋/刪除NOTIFICATION-IND,並且m_size將會丟失。要測試此功能,您可以禁用MMS自動下載(如果應用程序支持該功能),或僅禁用任何數據,因爲通知將作爲WAP Push消息發送。