使用 Android SDK 获取联系人中的地址
-
13-09-2019 - |
题
我正在尝试从 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,而无需反射。您只需要非常小心,不要在 1.6 设备中加载依赖于 2.0 类的类,否则类加载器将抛出异常。为了避免这种情况,您需要使用某种工厂来打破依赖关系(或像 Guice 这样的 DI 框架)。看到这个 发帖 以便进一步讨论。
其他提示
由于安东尼Forloney(下面 ),用于链接“如何读取联系人”,这是有用的。为了延长的链接的内容,用的代码如何读“地址”,这些线路应该帮助!他们应该通过查询获取邮寄地址,正如你看到的,在 StructuredPostal contants。
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