如何使用 Android Places API AutocompleteFilter

Posted

技术标签:

【中文标题】如何使用 Android Places API AutocompleteFilter【英文标题】:How to use Android Places API AutocompleteFilter 【发布时间】:2015-07-10 18:44:25 【问题描述】:

我正在尝试在我的应用程序中实现适用于 android 的新 Places API,但我似乎不知道如何为请求设置过滤器。这是我的代码。

LatLng southWest = new LatLng(85, -180);
LatLng northEast = new LatLng(-85, 180);
LatLngBounds bounds = new LatLngBounds(southWest, northEast);
AutocompleteFilter filter = AutocompleteFilter.create(WHAT SHOULD GO HERE?);
PendingResult result = Places.GeoDataApi.getAutocompletePredictions(mGoogleApiClient,
            search.getText().toString(), bounds, filter);

如您所见,我遵循了 google here 提供的文档,但我没有谈论如何实现过滤器,在阅读了 API Reference 之后,我仍然无法弄清楚如何实现 API。

我需要帮助来确定 API 的 AutocompleteFilter.create() 参数应该包含哪些内容。我想按城市过滤数据

谢谢

【问题讨论】:

【参考方案1】:

来自文档:

表 3:就地自动完成请求支持的类型

您可以通过传递 types 参数来将 Place Autocomplete 请求的结果限制为特定类型。该参数指定类型或类型集合,如下面支持的类型中所列。如果未指定任何内容,则返回所有类型。通常只允许使用一种类型。例外情况是您可以安全地混合地理编码和机构类型,但请注意,这与不指定类型具有相同的效果。支持的类型有:

geocode 指示 Place Autocomplete 服务仅返回地理编码结果,而不是业务结果。通常,您使用此请求来消除指定位置可能不确定的结果的歧义。 address 指示 Place Autocomplete 服务仅返回具有精确地址的地理编码结果。通常,当您知道用户将寻找完全指定的地址时,您会使用此请求。 建立指示 Place Autocomplete 服务仅返回业务结果。 (regions) 类型集合指示 Places 服务返回与以下类型匹配的任何结果: 地方性 次地方性 邮政编码 国家 行政区域级别_1 行政区域级别_2 (cities) 类型集合指示 Places 服务返回与 locality 或 Administrative_area_level_3 匹配的结果。

来源:https://developers.google.com/places/supported_types

代码:

    List<Integer> filterTypes = new ArrayList<Integer>();
    filterTypes.add( Place.TYPE_ESTABLISHMENT );

【讨论】:

嗨,保罗,你不知道如何将国家限制在边界框之外吗?谢谢。 我实际上不确定这是否可能,但如果是我不知道。 地址类型不存在...如果我想获得完整的地址结果,我应该使用哪些类型? @Ivan 关于在国家/地区限制结果而不使用边界框,您有两种选择:使用 REST API 或遍历返回的建议并仅返回最后一个单词是您感兴趣的国家/地区的结果. 希望有帮助。 @AbhishekPatel 我们决定选择第二个选项。它工作正常。干杯!【参考方案2】:

这就是您需要在 AutoComplete Place API 中设置过滤器的方式。

    List<Integer> filters = new ArrayList<Integer>();
        filters.add(Place.TYPE_ADMINISTRATIVE_AREA_LEVEL_1);
    mAutocompleteFilter = AutocompleteFilter.create(filters);
    mGeoLocationAdapter = new GeoLocationAdapter(this,
            android.R.layout.simple_list_item_1,
            latLngBounds,
            mAutocompleteFilter);

Android 仅支持少数类型, 你会得到

AutocompletePredictionBufferstatus=StatusstatusCode=NETWORK_ERROR, resolution=null

如果您使用不受支持的类型作为过滤器。

查看此链接了解支持的过滤器类型。

https://developers.google.com/places/supported_types#table3

【讨论】:

【参考方案3】:

如果您使用 Google Play 服务版本 8.4.0,您可以使用子类 AutocompleteFilter.Builder 来创建过滤器。

它更易于使用,因为您不必手动构建 Place 类型列表。

mAutocompleteFilter = AutocompleteFilter.Builder().
    setTypeFilter(AutocompleteFilter.TYPE_FILTER_CITIES).build();
mGeoLocationAdapter = new GeoLocationAdapter(this,
        android.R.layout.simple_list_item_1,
        latLngBounds,
        mAutocompleteFilter);

请注意,安装 google play services 8.4.0 版时当前存在兼容性问题。如果你遇到这个问题,你可以关注这个thread,但如果你遇到困难,我建议恢复到不推荐使用的静态AutocompleteFilter.create() 方法。

【讨论】:

【参考方案4】:

它适用于 Google Play 服务 9.4。

AutocompleteFilter filter = new AutocompleteFilter.Builder()
        .setTypeFilter(AutocompleteFilter.TYPE_FILTER_CITIES)
        .build();

【讨论】:

这是正确的解决方案,大家都应该使用这个

以上是关于如何使用 Android Places API AutocompleteFilter的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Android/Java 中的 Google Places API 获取有关地点的确切子类别名称? [复制]

获取适用于 Android 的 Google Places API 密钥

Android google Places API超出了每日配额

即使使用正确的 API 密钥,Android 自动完成的 Google Places API 请求也会被拒绝

适用于 Android 的 Google Places API:地图立即消失

使用适用于 android 的 google places api 网络服务搜索特定的附近地点