【问题标题】:Get address in contacts using Android SDK使用 Android SDK 在联系人中获取地址
【发布时间】:2009-12-06 19:11:13
【问题描述】:

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

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

【问题讨论】:

    标签: android addressbook google-contacts-api import-contacts


    【解决方案1】:

    在 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 的好群帖子是 herehere

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

    【讨论】:

      【解决方案2】:

      感谢 Anthony Forloney (below) 提供了“如何阅读联系人”的链接,这很有用。要扩展 that link 的内容,使用如何读取“地址”的代码,这些行应该会有所帮助!如您所见,他们应该通过使用 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();
      

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

      【讨论】:

        【解决方案3】:

        在我的手机自动取款机上,但here 是一个链接,其中包含与您类似的问题。

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

        编辑:

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

        祝你好运。

        【讨论】:

        • 这没有得到地址。我已经可以得到他的姓名和电话号码了。
        • 呃。我的错,我以为它有地址,让我环顾四周并编辑我的答案
        【解决方案4】:

        这就是我在 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 是通过捕获查看地址的意图获得的。 这里解决了:What is the intent associated with "View work address" in Contacts / Contact Card?

        不用_ID,请随意尝试ContactsContract.Data.CONTACT_ID

        【讨论】:

        猜你喜欢
        • 2012-11-26
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多