当您有联系人 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 时如何查询特定用户的所有短信的主要内容,如果未能解决你的问题,请参考以下文章

当您有列名“日期”时如何订购表 desc?

如何将联系人信息放入短信广播接收器类?

查询Firebase用户以检查数据库中是否存在联系人

当您有重复的子字符串时如何正确替换字符串?

如何实现php手机短信验证功能

检索特定联系人的所有详细信息