android - 如何使用 People API 获取有关 "other contacts"的完整信息?

标签 android google-people-api

背景
我正在开发一个需要获取“其他联系人”信息的应用程序,因为它们出现在“联系人”website of Google 的地址簿页面上:
enter image description here
问题
联系人 API 正在变为 deprecated ,而我们需要使用 People API。
为此,我使用了 Java 库 (here),它可以更轻松地访问各种功能。
可悲的是,根据文档(here),从“其他联系人”中查询项目列表,您最多只能获得 3 个可能的字段:

  • 电子邮件地址
  • 姓名
  • 电话号码

  • 确实,在使用它时,这就是我得到的。我也有“etag”和“resourceName”的字段,但就是这样。没有照片,没有封面照片,没有别的……
    执行此操作的代码非常短(在您设置完所有内容之后):
    val otherContactsResponse =
        otherContacts.list().setReadMask("emailAddresses,names,phoneNumbers")
            .setPageSize(itemsCountToRequest).setPageToken(nextPageToken).execute()
    val result=otherContactsResponse.otherContacts
    
    我试过的
  • 我试图查看是否可以通过“reourceName”查询(例如 this one),但似乎“其他联系人”的处理方式与普通联系人不同,所以这不起作用:
  • result.forEach { personBasic: Person ->
        val test: Person? = peopleService.get(personBasic.resourceName!!)
            .setPersonFields(
                "addresses,ageRanges,birthdays,coverPhotos,emailAddresses,genders,metadata,names,nicknames,occupations,organizations,phoneNumbers,photos,urls")
            .execute()
        Log.d("AppLog", "$test")
    }
    
  • 遗憾的是,对于“其他联系人”部分没有类似的查询可供搜索(here 除外,它再次为您提供相同的 3 个字段)。
  • 试图找出是否有其他我错过的可以在其他地方使用的字段。我什至不知道 resourceNameetag是可靠和独特的查询。
  • 尽管文档只讨论了 3 个字段,但尝试向查询中添加更多字段。失败了,当然...
  • 有一个函数叫做 copyOtherContactToMyContactsGroup ( here ) 这似乎会将联系人复制到主要联系人组。我想如果我使用它然后查询联系人本身(不仅仅是“其他联系人”),我可以获得所需的信息。但这是浪费时间并且会污染用户的通讯录,即使是暂时的。我必须确保在添加联系人后立即从那里删除联系人......

  • 编辑:也试过这个,虽然它似乎有效,但我不想使用它,因为它会污染通讯簿,其中包含用户未添加的联系人。另外,我有时会得到一张图片,它只是带有背景的人的字母。这是它的代码:
    result.firstOrNull { !it.names.isNullOrEmpty()&&!it.emailAddresses.isNullOrEmpty() }?.let { person ->
        val request =
            CopyOtherContactToMyContactsGroupRequest().setCopyMask(
                "emailAddresses,names,phoneNumbers")
                .setReadMask(
                    "addresses,ageRanges,birthdays,coverPhotos,emailAddresses,genders,metadata,names,nicknames,occupations,organizations,phoneNumbers,photos,urls")
        val copyResult: Person? =
            services!!.otherContacts.copyOtherContactToMyContactsGroup(
                person.resourceName, request).execute()
        Log.d("AppLog", "success $copyResult")
    }
    
    此外,与简单查询相比,这似乎非常慢,并且也没有批处理操作。此外,经过测试,我认为它可能会导致与达到配额相关的各种服务器问题(大约每分钟 180 个左右)。
    我认为由于网站显示照片并且可以显示每个联系人信息,我们应该也有这个 API,不是吗?
  • 我想也许我可以创建一个新组(标签),将“其他联系人”复制到那里,然后从那里获取信息(因为它允许获取更多字段),但是文档(here)说以前是可能的,现在不可能了:

  • The only system contact groups that can have members added are contactGroups/myContacts and contactGroups/starred. Other system contact groups are deprecated and can only have contacts removed.


    这是一个更好的解决方案(如果可行的话),因为我可以安全地删除组而不影响实际联系人。
    问题
    为了获取有关“其他联系人”列表中每个项目的各种信息(如普通联系人),我应该使用什么最佳方式?是否可以不复制到联系人列表并且不获取(联系人首字母的)“假”照片?

    最佳答案

    好吧,很遗憾,现在我有一个解决方法。
    首先,我将各种字段复制到一个新的 Person 对象,每个查询结果一个,然后我使用 batchCreateContacts 将它们全部添加。 ( here ,每批处理的最大项目数是 ),然后我使用 batchDeleteContacts 将它们全部删除( here ,每批最大项目数为 500)
    可悲的是,这仍然会污染通讯录,但它比我发现的要快得多,而且它也是暂时的。
    我发现的奇怪的事情:

  • API 使用情况似乎与网站上显示的项目不完全相同。我知道是因为我试图在网站上找到从 API 中找到的姓名和电子邮件,但没有显示出来。更奇怪的是:它们之间的项目数似乎相同
  • 有些元素只有名字,这很奇怪,因为:它们是如何到达那里的?
  • 关于android - 如何使用 People API 获取有关 "other contacts"的完整信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67401796/

    相关文章:

    java - 需要转义字符串中的 double 字符或一些特殊字符

    python - 通过服务帐户使用 Google People API

    android - Google People API 无法获取生日年份

    android - 在上下文操作中使用导航会引发异常

    android - 单击按钮一次打开文件夹(SD 卡)中的所有图像

    android - Idea Intellij 截图

    ruby - failedPrecondition : Must be a G Suite domain user. 使用服务帐户管理 ruby​​ 中的联系人

    google-api - 无法使用 Google People API 更新照片

    google-contacts-api - 可以使用 Google People Api 创建、编辑、删除联系人吗?

    android - 如何用前导零格式化资源字符串?