Android 如何使用Telephony.Sms仅检索每个会话的最后一条消息,包括锁定的消息?
我正在使用下面的代码从sms中检索消息Android 如何使用Telephony.Sms仅检索每个会话的最后一条消息,包括锁定的消息?,android,telephony,android-sms,Android,Telephony,Android Sms,我正在使用下面的代码从sms中检索消息 private List<String> getEveryLastMessages(){ List<String> listSms = new ArrayList<String>(); ContentResolver contentResolver = getActivity().getContentResolver(); Cursor c = contentResolver.query(Tel
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;
}
private List getEveryLastMessages(){
List listSms=新的ArrayList();
ContentResolver ContentResolver=getActivity().getContentResolver();
游标c=contentResolver.query(Telephony.Sms.Inbox.CONTENT\u URI,//来自文档的官方内容\u URI
新字符串[]{Telephony.Sms.Inbox.BODY},//选择正文文本
无效的
无效的
Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);//默认排序顺序
int totalSMS=c.getCount();
if(c.moveToFirst()){
对于(int i=0;i
我的问题是,除锁定的邮件外,所有邮件都已检索
我试图实现的是只检索
每个对话,包括锁定邮件,并将其填充到我的recyclerview adapater中,以显示为收件箱。如果您希望每个对话中的最后一条邮件,无论它是发送的还是接收的,都有一个方便的内置URI,您可以使用它,而不只是获取所有内容并自己过滤
Telephony.Sms.Conversations.CONTENT\u 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\u COUNT
)“MSG\u COUNT”
(Telephony.Sms.Conversations.THREAD\u ID
)“THREAD\u ID”
SNIPPET
列将是该对话中可用的最新消息
不幸的是,从Marshmallow(API级别21)开始,任何不是默认消息传递应用程序的应用程序都只能访问SMS表的受限视图。这样的应用程序只能获取带有MESSAGE\u TYPE\u INBOX
或MESSAGE\u TYPE\u SENT
的Telephony.Sms.TYPE
的消息。这意味着,除非您的应用程序是当前默认应用程序,否则您将不会获得消息类型类型类型类型类型类型失败
,消息类型类型类型类型类型草案
,等等
但是,
Telephony.Sms.LOCKED
列与TYPE
列是完全独立的分类,因此不应出现在受限视图中。也就是说,无论你的应用程序是否为默认应用程序,只要它们被发送或收件箱中,你就应该能够获得锁定的消息。当然,制造商可能已经改变了所描述的任何行为,您可能需要在应用程序中对此进行说明。Hmm,这似乎不是标准行为。您确定锁定的消息是已接收的消息吗?也就是说,你确定它在收件箱中吗?你在测试哪个安卓版本?如果这是一个实际的设备,具体是什么?此外,您还声明希望“每次对话的最后一条消息”。如果最后一条消息是已发送的消息怎么办?根据您的需要,可能会有所帮助。是的,锁定的邮件是一个已收到的邮件。不确定被锁定的邮件是否在收件箱中,但android的默认messenger在列表中,它只是被锁定了。我目前正在安卓棉花糖上测试它,是的,我正在使用一个实际的设备,型号是INFINIX HOT S X521。最后一条消息是否发送、发送失败、草稿、锁定等都无关紧要,只要它是每个对话中的最后一个内容。谢谢,我会查一下那篇文章。好的,我只是问一下“收到的邮件/收件箱”,因为这就是你在那里的代码片段中查询的全部内容-Telephony.Sms.inbox.CONTENT\u URI
。Anyhoo,从棉花糖开始,非默认应用程序只能访问SMS表的受限视图,并且只能获取收件箱和发送的消息,因此除非您的应用程序是默认消息应用程序,否则您不会获取失败或草稿消息。但是,locked是与这些不同的东西,不应该出现在受限视图中,至少在标准API中是这样。不过,OEM可能会更改其中任何一项。awt。就是这样,让我试试从你共享的链接中得到的。@Mike M.-请将你的评论输入答案,我想将其标记为正确答案。非常感谢。