当您拥有联系人ID

时间:2017-05-23 20:35:20

标签: android sms telephony contactscontract

如何检索特定联系人的所有短信?

我看到了检索所有短信的方法,然后特别过滤给了这个人。但我想使用联系人ID /电话号码进行查询。

我使用ContactsContract.CommonDataKinds.Phone.NUMBER查询联系人。但该字符串似乎与address中的Telephony.Sms.Inbox.ADDRESS格式不匹配。

一个数字有括号和破折号,而其他数字没有。

总是这样吗?如果没有,如果您已经拥有联系人ID,查询所有短信的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

有很多方法可以实现这一点,但最好的方法是找到具有该联系人/号码的会话线程的thread-id,然后查询所有消息的thread-id。

请注意,不同API级别存在很多问题,设备具有双SIM卡,mms / sms消息等。

查询所有线程(使用其thread-id):

// This projection is suitable for API-19 and above only
String[] projection = { Threads._ID, Threads.RECIPIENT_IDS, "sort_index", Threads.SNIPPET }
Uri uri = Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build();
Cursor cur = getContentResolver().query(uri, projection, selection, null, "sort_index" + " DESC");

要在RecipientId和电话号码之间进行转换,您可以将Android RecipientIdCache class复制到您的项目中。它是用于将id转换为数字的单例类。

按thread-id查询所有消息:

// This projection is suitable for API-19 and above only
String[] projection = new String[]{
   MmsSms.TYPE_DISCRIMINATOR_COLUMN, 
   Telephony.Sms._ID, 
   Telephony.Sms.BODY, 
   "sort_index", 
   Telephony.Sms.DATE_SENT
};
Uri uri = ContentUris.withAppendedId(Threads.CONTENT_URI, id);
Cursor cur = getContentResolver().query(uri, projection, null, null, null);