gpt4 book ai didi

android - 如何使用 Telephony.Sms 仅检索每个对话的最后一条消息,包括锁定的消息?

转载 作者:行者123 更新时间:2023-11-29 19:07:10 26 4
gpt4 key购买 nike

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

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

最佳答案

如果您想要每次对话中的最后一条消息,无论它是发送还是接收,您都可以使用一个方便的内置 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(“fragment ”)
  • Telephony.Sms.Conversations.MSG_COUNT ("msg_count")
  • Telephony.Sms.Conversations.THREAD_ID ("thread_id")

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

不幸的是,从 Marshmallow(API 级别 21)开始,任何不是默认消息传递应用程序的应用程序都只能访问 SMS 表的受限 View 。这样的应用程序只能接收 Telephony.Sms.TYPEMESSAGE_TYPE_INBOXMESSAGE_TYPE_SENT 的消息。这意味着您不会收到 MESSAGE_TYPE_FAILEDMESSAGE_TYPE_DRAFT 等,除非您的应用是当前的默认应用。

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

关于android - 如何使用 Telephony.Sms 仅检索每个对话的最后一条消息,包括锁定的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46770478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com