2017-10-16 97 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列完全分开的分类,所以不应该进入受限制的视图。也就是说,只要他们发送的邮件是,或者收件箱,无论您的应用是否为默认邮件,您都应该可以获得锁定邮件。当然,制造商可能已经改变了所描述的任何行为,并且您可能需要在您的应用中对此进行说明。

相关问题