Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用Telephony.Sms仅检索每个会话的最后一条消息,包括锁定的消息?_Android_Telephony_Android Sms - Fatal编程技术网

Android 如何使用Telephony.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

我正在使用下面的代码从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;
}
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.-请将你的评论输入答案,我想将其标记为正确答案。非常感谢。