安卓联系人查询
Posted
技术标签:
【中文标题】安卓联系人查询【英文标题】:Android contact query 【发布时间】:2011-03-07 05:25:55 【问题描述】:我在查询电话簿联系人时遇到问题。我需要做的是获取同时输入了电话和电子邮件或属于特定类型的联系人列表。
基本上是这样的:
public static final String SELECTION =
"("+ContactsContract.Contacts.HAS_PHONE_NUMBER +"='1') OR " + RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'";
现在,问题是,RawContacts.ACCOUNT_TYPE
不存在于我的查询中使用的ContactsContract.Contacts.CONTENT_URI
。我猜我需要加入另一张桌子,但不知道该怎么做。
有人可以帮我吗?
【问题讨论】:
【参考方案1】:读取原始联系人以及与之关联的所有数据的最佳方法是使用ContactsContract.RawContacts.Entity
目录。如果原始联系人有数据行,实体游标将包含每个数据行对应的一行。如果原始联系人没有数据行,则光标仍将包含一行包含原始联系人级别信息。
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);
Cursor c = getContentResolver().query(entityUri,
new String[]RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1,
null, null, null);
try
while (c.moveToNext())
String sourceId = c.getString(0);
if (!c.isNull(1))
String mimeType = c.getString(2);
String data = c.getString(3);
//decide here based on mimeType, see comment later
finally
c.close();
您必须根据 mimeType 过滤结果
例如,如果 mimeType 是 Phone.CONTENT_ITEM_TYPE
,那么列 DATA1
存储电话号码,但如果数据类型是 Email.CONTENT_ITEM_TYPE
,那么 DATA1
存储电子邮件地址。
这样您就不必使用HAS_PHONE_NUMBER
,因为您将直接遍历项目。
【讨论】:
【参考方案2】:也许您应该使用Email.CONTENT_URI
,因为它包含"vnd.android.cursor.item/email_v2"
MIME 类型的所有数据记录,并结合了关联的原始联系人和聚合联系人数据。
【讨论】:
以上是关于安卓联系人查询的主要内容,如果未能解决你的问题,请参考以下文章