我正在尝试从 android 联系人列表中检索联系人的姓名、电话号码和地址。名称和电话非常简单,但地址似乎无法通过 1.6 api 级别访问。
有人知道如何获取联系人的地址吗?2.0 中还有一个全新的 api。我如何利用这一点并通过使用 1 个二进制文件回退到旧 api。如果这甚至可能的话。
我正在尝试从 android 联系人列表中检索联系人的姓名、电话号码和地址。名称和电话非常简单,但地址似乎无法通过 1.6 api 级别访问。
有人知道如何获取联系人的地址吗?2.0 中还有一个全新的 api。我如何利用这一点并通过使用 1 个二进制文件回退到旧 api。如果这甚至可能的话。
在 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 的好帖子在这里和这里。
从同一个二进制文件中针对多个平台 API 的推荐方法是使用反射(请参阅此博客文章)。我发现如果您在清单中将您的应用程序定位为 1.6 或更低版本,但设置构建路径以获取 Android 2.0 jar 文件,您可以调用 2.0 api 而无需反射。您只需要非常小心,依赖于 2.0 类的类不会加载到 1.6 设备中,否则类加载器会抛出异常。为避免这种情况,您将需要使用某种工厂来打破依赖关系(或像 Guice 这样的 DI 框架)。请参阅此帖子以进行进一步讨论。
感谢 Anthony Forloney(下文)提供“如何阅读联系人”的链接,这很有用。要扩展该链接的内容,使用如何读取“地址”的代码,这些行应该会有所帮助!如您所见,他们应该通过使用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();
该链接的其余部分确实获取了名称和电话(当您更正布尔值的“有电话号码”错误时——布尔值没有被正确解析)
在我的手机自动取款机上,但这里有一个与您的问题类似的链接。
我希望这对您有所帮助或指出正确的方向。
我已经提到过,我会编辑我的原始答案,至少针对您正在寻找的内容,这可能很晚了,您已经有了答案,但是如果您仍在寻找一些,这里有更多信息,您需要寻找什么是ContactsContract.CommonDataKinds.StructuredPostal,您可以提取有关地址的具体详细信息。至于使用 Android 2.0 的示例,这里显示了一些从联系人中提取信息的示例,也就是说,如果您还没有弄清楚的话。
祝你好运。
这就是我使用 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
是通过捕获查看地址的意图来获得的。这在这里解决了:与联系人/联系人卡片中的“查看工作地址”相关联的意图是什么?
取而代之_ID
,请随意尝试ContactsContract.Data.CONTACT_ID