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

使用Android SDK获取联系人中的地址,android,addressbook,google-contacts-api,import-contacts,Android,Addressbook,Google Contacts Api,Import Contacts,我正在尝试从android联系人列表中检索联系人的姓名、电话号码和地址。名字和电话都很简单,但地址似乎无法通过1.6API级别访问 有人知道如何获得联系人的地址了吗?2.0中还有一个全新的api。如何利用这一点,并通过使用1个二进制文件回退到旧的api。如果有可能的话。在我的手机atm上,但这是一个与你的问题类似的链接 我希望这能帮助你或为你指明正确的方向 编辑: 我已经提到,我会编辑我的原始答案,至少对你正在寻找的,这可能是邪恶的晚了,你已经有你的答案,但这里有更多的信息,如果你仍然在寻找一些

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

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

在我的手机atm上,但这是一个与你的问题类似的链接

我希望这能帮助你或为你指明正确的方向

编辑: 我已经提到,我会编辑我的原始答案,至少对你正在寻找的,这可能是邪恶的晚了,你已经有你的答案,但这里有更多的信息,如果你仍然在寻找一些,你需要寻找的是,你可以提取有关地址的具体细节。例如,使用Android2.0的示例显示了一些从联系人提取信息的示例,如果您还没有弄清楚的话


祝你好运。

在Android 2.0之前,你需要查询Contacts.ContactMethods.CONTENT\u 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或以下,但是设置构建路径来获取Android2.0JAR文件,你可以调用2.0API,而不需要反射。您只需要非常小心,依赖于2.0类的类不会加载到1.6设备中,否则类加载程序将抛出。为了避免这种情况,您需要使用某种工厂来打破依赖关系(或者像Guice这样的DI框架)。进一步讨论请参见此链接。

感谢Anthony Forloney()提供了“如何阅读联系人”的链接,这非常有用。要扩展的内容,与如何阅读“地址”的代码,这些行应该有帮助!如您所见,他们应该通过使用StructuredPostalcontants查询来获取邮政地址

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

其余的确实会获取名称和电话(当您更正布尔值的“has Phone number”错误时——布尔值没有得到正确解析)

这就是我在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
。 这里解决了这个问题:


请不要使用
\u ID
,而是尝试使用
联系人contract.Data.CONTACT\u ID

这无法获取地址。我已经知道他的名字和电话号码了。我的错,我以为它有地址,让我四处看看,编辑我的答案。这是我在网上看到的最好的2.0+联系人教程: