2

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

有人知道如何获取联系人的地址吗?2.0 中还有一个全新的 api。我如何利用这一点并通过使用 1 个二进制文件回退到旧 api。如果这甚至可能的话。

4

4 回答 4

7

在 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 框架)。请参阅此帖子以进行进一步讨论。

于 2009-12-07T11:53:46.393 回答
4

感谢 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();

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

于 2010-10-22T19:48:49.693 回答
1

在我的手机自动取款机上,但这里有一个与您的问题类似的链接。

我希望这对您有所帮助或指出正确的方向。

编辑:

我已经提到过,我会编辑我的原始答案,至少针对您正在寻找的内容,这可能很晚了,您已经有了答案,但是如果您仍在寻找一些,这里有更多信息,您需要寻找什么是ContactsContract.CommonDataKinds.StructuredPostal,您可以提取有关地址的具体详细信息。至于使用 Android 2.0 的示例,这里显示了一些从联系人中提取信息的示例,也就是说,如果您还没有弄清楚的话。

祝你好运。

于 2009-12-06T19:42:57.933 回答
1

这就是我使用 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

于 2011-07-25T05:55:10.553 回答