如何使用电子邮件和/或电话号码查询 Android 2.x 联系人?

Posted

技术标签:

【中文标题】如何使用电子邮件和/或电话号码查询 Android 2.x 联系人?【英文标题】:How to query Android 2.x Contacts with Emails and/or Phone Numbers? 【发布时间】:2011-06-04 08:13:39 【问题描述】:

让我们暴力​​破解您的普通 android 2.x 可见联系人 ID/姓名光标(通过 ContactsContract):

Cursor c = getContentResolver().query(
  Contacts.CONTENT_URI,
  new String[]  Contacts._ID, Contacts.DISPLAY_NAME ,
  Contacts.IN_VISIBLE_GROUP + " = '1'",
  null,
  Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"
);

有没有办法过滤这个以获取只有至少一个电子邮件和/或电话号码的联系人?

我发现我可以使用 Contacts.HAS_PHONE_NUMBER ...但我在任何地方都看不到 HAS_EMAIL。 (告诉我这不会变得丑陋。)

【问题讨论】:

【参考方案1】:

查询相应的内容提供者Uri。例如,android.provider.ContactsContract.CommonDataKinds.Email 允许您获取电子邮件地址,并且您的其他列(例如,IN_VISIBLE_GROUP)被隐式加入。

Here is a sample project 演示使用这些其他内容提供程序 Uri 值。

【讨论】:

马克来了!非常感谢。我将带 Spinners 进行一次,嗯,旋转。不过,我应该澄清一下。我意识到我总是可以单独浏览联系人,但我试图一口气获得过滤列表。 @Joe D'Andrea:“但我试图一举获得过滤后的列表”......这就是我提供的示例所展示的。当您查询像 CommonDataKinds.Email 这样的“辅助”“表”时,您需要利用 ContactsContract 内容提供程序提供的隐式连接。 完美。这就是我所缺少的 - 隐式连接。 (现在尝试让 Eclipse 导入项目!) @Joe D'Andrea:是的,这就是我不喜欢内容提供商的原因之一——你自己没有办法加入,而且你依靠有限的文档来找出可以代表您完成的连接。 @CommonsWare:叹息,是的,这很令人沮丧。我想我需要搞砸 managedQuery 只是为了看看 SQL 是什么并从那里进行逆向工程。我本质上是在尝试编写一个 buildEmailPhonesAdapter,也就是说,我想用电子邮件和/或电话号码来提取联系人,而不是分开。我确定我错过了隐式连接。例如,我认为仅将 Phone.NUMBER 添加到电子邮件适配器 PROJECTION 是不够的 - 除了可能是错误的(那些有电话号码但没有电子邮件的人呢?)。【参考方案2】:

我只是枚举了在联系人上获取的光标上的列:

Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
String[] names = c.getColumnNames();
for (String string : names) 
    Log.d("ContactList", "RC column " + string);

c.close();

结果包含has_email。不过,它可能是特定于银河选项卡的。

【讨论】:

以上是关于如何使用电子邮件和/或电话号码查询 Android 2.x 联系人?的主要内容,如果未能解决你的问题,请参考以下文章

Android 联系人选择器:选择电话或电子邮件

如何在Android的文本视图中使电话号码可点击

如何从 Android 中的 Vision OCR 结果文本中提取姓名、电话号码和电子邮件地址?

如何根据电话号码查询 Android 联系人?

如何从 Android 设备中仅获取电话号码联系人

从 Android 联系人中获取电子邮件和电话