【发布时间】:2009-12-06 19:11:13
【问题描述】:
我正在尝试从 Android 联系人列表中检索联系人的姓名、电话号码和地址。名称和电话非常简单,但地址似乎无法通过 1.6 api 级别访问。
有人知道如何获取联系人的地址吗? 2.0 中还有一个全新的 api。我如何利用这一点并通过使用 1 个二进制文件回退到旧 api。如果有可能的话。
【问题讨论】:
标签: android addressbook google-contacts-api import-contacts
我正在尝试从 Android 联系人列表中检索联系人的姓名、电话号码和地址。名称和电话非常简单,但地址似乎无法通过 1.6 api 级别访问。
有人知道如何获取联系人的地址吗? 2.0 中还有一个全新的 api。我如何利用这一点并通过使用 1 个二进制文件回退到旧 api。如果有可能的话。
【问题讨论】:
标签: android addressbook google-contacts-api import-contacts
在 Android 2.0 之前,您需要查询 Contacts.ContactMethods.CONTENT_URI 以获取您需要传递的邮政地址
Contacts.ContactMethods.PERSON_ID + "=? and " + Contacts.ContactMethods.KIND + "=?"
对于选择和对于 selectArgs 参数:
new String[] { personId, Integer.toString(Contacts.KIND_POSTAL) }
从 2.0 开始,您使用新的 ContactsContract,它要复杂得多,因为联系人现在可以跨多个来源汇总信息。一些关于新 API 的好群帖子是 here 和 here。
针对同一二进制文件中的多个平台 API 的推荐方法是使用反射(参见 blog post)。我发现如果您在清单中将您的应用程序定位为 1.6 或更低版本,但设置构建路径以获取 Android 2.0 jar 文件,您可以调用 2.0 api 而无需反射。您只需要非常小心,依赖于 2.0 类的类不会加载到 1.6 设备中,否则类加载器会抛出异常。为避免这种情况,您将需要使用某种工厂来打破依赖关系(或像 Guice 这样的 DI 框架)。请参阅此posting 以进行进一步讨论。
【讨论】:
感谢 Anthony Forloney (below) 提供了“如何阅读联系人”的链接,这很有用。要扩展 that link 的内容,使用如何读取“地址”的代码,这些行应该会有所帮助!如您所见,他们应该通过使用 StructuredPostal 内容进行查询来获取邮政地址。
Cursor postals = getContentResolver().query(
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = "
+ contactId, null, null);
int postFormattedNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS);
int postTypeNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE);
int postStreetNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET);
while (postals.moveToNext()) {
String postalData = postals.getString(postFormattedNdx);
postalCat = postalCat+ postalData+ ", [";
postalData = String.valueOf(postals.getInt(postTypeNdx));
postalCat = postalCat+ postalData+ "], ";
postalData = postals.getString(postStreetNdx);
postalCat = postalCat+ postalData+ " ";
}
postals.close();
that link 的其余部分确实获取了姓名和电话(当您更正布尔值的“有电话号码”错误时——布尔值没有被正确解析)
【讨论】:
在我的手机自动取款机上,但here 是一个链接,其中包含与您类似的问题。
我希望这对您有所帮助或指出正确的方向。
我已经提到,我会编辑我的原始答案,至少针对您正在寻找的内容,这可能很晚了,您已经有了答案,但是如果您仍在寻找一些,这里有更多信息,您需要什么要查找的是ContactsContract.CommonDataKinds.StructuredPostal,您可以提取有关地址的具体详细信息。至于使用 Android 2.0 的示例here 显示了一些从联系人中提取信息的示例,如果您还没有弄清楚的话。
祝你好运。
【讨论】:
这就是我在 Android 2.3.3 上的做法:
String where = ContactsContract.Data._ID + " = "
+ uriData.getLastPathSegment()
+ " AND ContactsContract.Data.MIMETYPE = '"
+ ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE
+ "'";
String[] projection = new String[] { StructuredPostal.STREET,
StructuredPostal.CITY,
StructuredPostal.REGION,
StructuredPostal.POSTCODE,
StructuredPostal.COUNTRY};
Cursor cursor = getContentResolver().query( ContactsContract.Data.CONTENT_URI,
projection,
where,
null,
null);
String strOutput = "";
if (cursor.moveToFirst())
{
strOutput += "\n" + cursor.getString(0);
strOutput += "\n" + cursor.getString(1);
strOutput += "\n" + cursor.getString(2);
strOutput += "\n" + cursor.getString(3);
strOutput += "\n" + cursor.getString(4);
}
cursor.close();
注意:uriData 是通过捕获查看地址的意图获得的。
这里解决了:What is the intent associated with "View work address" in Contacts / Contact Card?
不用_ID,请随意尝试ContactsContract.Data.CONTACT_ID
【讨论】: