使用Android SDK在联系人中获取地址

Jer*_*rds 1 android import-contacts addressbook google-contacts-api

我正在尝试从Android联系人列表中检索联系人的姓名,电话号码和地址.名称和电话非常简单,但1.6 api级别的地址似乎无法访问.

有人想出如何获得联系人的地址吗?2.0中还有一个全新的api.如何通过使用1二进制来利用这个并回退到旧的api.如果这是可能的.

Nic*_*ong 7

在Android 2.0之前,您需要查询Contacts.ContactMethods.CONTENT_URI以获取您需要传递的邮政地址

Contacts.ContactMethods.PERSON_ID + "=? and " + Contacts.ContactMethods.KIND + "=?"
Run Code Online (Sandbox Code Playgroud)

用于选择和selectArgs参数:

new String[] { personId, Integer.toString(Contacts.KIND_POSTAL) }
Run Code Online (Sandbox Code Playgroud)

从2.0开始,您使用新的ContactsContract,它更加复杂,因为联系人现在可以在多个来源之间汇总信息.关于新API的一些好的小组发布在这里这里.

从同一二进制文件中定位多个平台API的推荐方法是使用反射(请参阅此博客文章).我发现如果您在清单中将应用程序定位在1.6或更低,但设置构建路径以获取Android 2.0 jar文件,您可以调用2.0 apis而无需反射.您只需要非常小心,依赖于2.0类的类不会加载到1.6设备中,否则类加载器将抛出.为了避免这种情况,你需要使用某种工厂来破坏依赖关系(或像Guice这样的DI框架).有关进一步讨论,请参阅此帖子


Jor*_*Gee 6

感谢 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();
Run Code Online (Sandbox Code Playgroud)

该链接的其余部分确实获取了姓名和电话(当您更正布尔值的“有电话号码”错误时 - 布尔值无法正确解析)