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

时间:2017-10-16 12:34:46

标签: android telephony android-sms

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

// use the Embedded Derby JDBC driver
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();

// connect to the database
Connection connect = DriverManager
            .getConnection("jdbc:derby:MyDBTest;create=true");

// execute a Query
PreparedStatement statement = connect
            .prepareStatement("SELECT * from USERS");
ResultSet resultSet = statement.executeQuery();
       :

我的问题是检索到的所有邮件以及锁定的邮件除外。

我想要实现的只是检索最后一条消息 每个对话,包括锁定消息,并将其填充到我的recyclerview适配器中,以显示为收件箱。

1 个答案:

答案 0 :(得分:1)

如果您想要每个会话中的最后一条消息,无论是发送还是接收,都可以使用一个方便的内置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.TYPE MESSAGE_TYPE_INBOXMESSAGE_TYPE_SENT的邮件。这意味着除非您的应用是当前的默认应用,否则您将无法获得MESSAGE_TYPE_FAILEDMESSAGE_TYPE_DRAFT等。

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