2017-10-16 49 views
0

我正在使用下面的代碼從短信中檢索郵件。如何僅使用Telephony.Sms檢索每個對話的最後一條消息,包括鎖定的消息?

private List<String> getEveryLastMessages(){ 
    List<String> listSms = new ArrayList<String>(); 
    ContentResolver contentResolver = getActivity().getContentResolver(); 

    Cursor c = contentResolver.query(Telephony.Sms.Inbox.CONTENT_URI, // Official CONTENT_URI from docs 
       new String[] { Telephony.Sms.Inbox.BODY }, // Select body text 
       null, 
       null, 
       Telephony.Sms.Inbox.DEFAULT_SORT_ORDER); // Default sort order 

    int totalSMS = c.getCount(); 

    if (c.moveToFirst()) { 
     for (int i = 0; i < totalSMS; i++) { 
      listSms.add(c.getString(0)); 
      listSms.add("\n"); 
      c.moveToNext(); 
     } 
    } else { 
     //Do something, no messages 
    } 
    c.close(); 

     return listSms; 
} 

我的問題是所有的郵件被檢索,除了鎖定的消息。

我試圖實現的是隻檢索 每個對話的最後一條消息,包括鎖定消息並將其填充到我的recyclerview adapater中以將其顯示爲收件箱。

+0

嗯,這似乎不是標準的行爲。你確定鎖定的信息是收到的信息嗎?也就是說,你確定它在收件箱中嗎?你正在測試哪個Android版本?如果這是一個實際的設備,具體是什麼?另外,你聲明你想要「每個對話的最後一條消息」。如果最後一條消息是發送消息怎麼辦?根據你的需要,[這篇文章](https://stackoverflow.com/q/42068940)可能會有所幫助。 –

+0

是的,鎖定的消息是收到的消息。不知道鎖定的消息是否在收件箱中,但Android的默認消息傳遞程序在列表中,它只是鎖定。我目前正在Android棉花糖上測試它,是的,我使用的是一款實際的設備,型號爲INFINIX HOT S X521。只要它是每個對話的最後一個內容,是否發送最後一條消息,發送失敗,草稿,鎖定等都無關緊要。謝謝,我會檢查這個帖子。 – Polar

+0

好的,我只是在問收件箱/收件箱,因爲這就是你在你的代碼段中查詢的所有內容 - 「Telephony.Sms.Inbox.CONTENT_URI」。 Anyhoo,從棉花糖開始,非默認應用程序只能訪問SMS表的受限視圖,並且只能獲取_inbox_和_sent_消息,所以除非您的應用程序是默認消息應用程序,否則不會獲取_failed_或_draft_消息。然而,_locked_與這些不同,不應該考慮到這種限制的觀點,至少在標準的API中。不過,OEM可能會改變這一切。 –

回答

0

如果您想要每個對話中的最後一條消息,無論它是發送還是接收,都可以使用一個方便的內置URI,以代替只抓取所有內容並自行過濾。

Telephony.Sms.Conversations.CONTENT_URI(在android.provider包中)可用於查詢ContentResolver以檢索可用會話的摘要。例如:

  • Telephony.Sms.Conversations.SNIPPET"snippet"
  • Telephony.Sms.Conversations.MSG_COUNT"msg_count"
  • Telephony.Sms.Conversations.THREAD_ID"thread_id"

SNIPPET

Cursor c = contentResolver.query(Telephony.Sms.Conversations.CONTENT_URI, 
           null, null, null, null); 

此查詢將有三列返回柱將成爲該對話中最新的可用消息。

不幸的是,從棉花糖(API級別21)開始,任何不是默認消息應用程序的應用程序都只能訪問SMS表的受限視圖。這樣的應用程序只能得到Telephony.Sms.TYPEMESSAGE_TYPE_INBOXMESSAGE_TYPE_SENT的消息。這意味着你不會得到MESSAGE_TYPE_FAILEDMESSAGE_TYPE_DRAFT等,除非你的應用程序是當前的默認應用程序。

但是,Telephony.Sms.LOCKED列是與TYPE列完全分開的分類,所以不應該進入受限制的視圖。也就是說,只要他們發送的郵件是,或者收件箱,無論您的應用是否爲默認郵件,您都應該可以獲得鎖定郵件。當然,製造商可能已經改變了所描述的任何行爲,並且您可能需要在您的應用中對此進行說明。

相關問題