当您有联系人 ID 时如何查询特定用户的所有短信
Posted
技术标签:
【中文标题】当您有联系人 ID 时如何查询特定用户的所有短信【英文标题】:How to query for all sms messages by a specific user when you have the contact ID 【发布时间】:2017-10-23 23:30:50 【问题描述】:您如何检索特定联系人的所有短信?
我看到了检索所有短信然后过滤到特定人的方法。但我想使用联系人 ID/电话号码进行查询。
我正在使用ContactsContract.CommonDataKinds.Phone.NUMBER
查询联系人。但该字符串似乎与Telephony.Sms.Inbox.ADDRESS
中的address
格式不匹配。
一个数字有括号和破折号,而其他数字没有。
总是这样吗?如果没有,如果您已经有联系人 ID,那么查询所有短信的最佳方法是什么?
【问题讨论】:
【参考方案1】:有很多方法可以做到这一点,但最好的方法是找到具有该联系人/号码的对话线程的线程 ID,然后查询所有消息的线程 ID。
请注意,不同的 API 级别、具有双 SIM 卡的设备、mms/sms 消息等存在很多问题。
查询所有线程(带有线程 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);
【讨论】:
recipientId 是否与ContactsContract.Contacts._ID 相同?因为这就是我所拥有的。用户从联系人列表中选择一个,我必须阅读该联系人的所有短信。 RecipientIdCache 还使用 content://mms-sms/canonical-address 和 content://mms-sms/canonical-addresses。这两者有什么区别? 不,contact-id不是recipient-id,recipient-id是每个sms对话的唯一id,sms对话可以与非联系人的联系人、电话号码进行,一组电话号码和特殊的非电话地址,如“GOOGLE”(这是一个有效的短信地址)以上是关于当您有联系人 ID 时如何查询特定用户的所有短信的主要内容,如果未能解决你的问题,请参考以下文章