1

我正在使用以下代码从短信中检索消息。

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 适配器中以将其显示为收件箱。

4

1 回答 1

3

如果您想要每次对话中的最后一条消息,无论它是发送还是接收,都可以使用方便的内置 URI,而不是只抓取所有内容并自行过滤。

Telephony.Sms.Conversations.CONTENT_URI(在android.provider包中)可用于ContentResolver查询以检索可用对话的摘要。例如:

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

此查询将返回三列:

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

SNIPPET列将是该对话中最新的可用消息。

不幸的是,从 Marshmallow(API 级别 21)开始,任何不是默认消息应用程序的应用程序都只能访问 SMS 表的受限视图。这样的应用程序只能获取带有Telephony.Sms.TYPEofMESSAGE_TYPE_INBOX或的消息MESSAGE_TYPE_SENT。这意味着您不会得到MESSAGE_TYPE_FAILED,MESSAGE_TYPE_DRAFT等,除非您的应用是当前的默认应用。

但是,该Telephony.Sms.LOCKED列是与该列完全分开的分类TYPE,因此不应出现在受限视图中。也就是说,无论您的应用程序是否为默认应用程序,只要它们已发送收件箱,您就应该能够获得锁定的消息。当然,制造商可能已经改变了任何描述的行为,您可能需要在您的应用程序中考虑到这一点。

于 2017-10-18T04:17:59.210 回答