You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Places API中PlaceFilter使用问题:如何正确过滤餐厅地点?

关于PlaceFilter的正确使用(适配餐厅评分应用场景)

针对你的问题,我来拆解下怎么正确用PlaceFilter,以及它是否适合你的餐厅评分应用:

1. 该不该用PlaceFilter?

完全应该用!对于你的餐厅评分应用来说,PlaceFilter能帮你精准过滤出餐厅类场所,避免拿到一堆无关的地点(比如超市、加油站),既减少了数据处理量,也能让结果更贴合你的业务需求。

2. 你之前的问题出在哪?

你尝试的两种方式里,第二种Place.TYPE_RESTAURANT.toString()是多余的——因为Place.TYPE_RESTAURANT本身就是官方定义的字符串常量,转toString()反而可能导致匹配失效,这也是你拿不到结果的核心原因之一。

3. 正确的使用步骤

第一步:正确创建PlaceFilter

直接使用官方的类型常量即可,不需要额外转换:

val placeFilter = PlaceFilter(false, mutableListOf(Place.TYPE_RESTAURANT))
  • 第一个参数false表示不通过Place ID过滤,而是通过场所类型过滤;
  • 第二个参数传入包含Place.TYPE_RESTAURANT的列表,指定只返回餐厅类型的场所。

第二步:确保权限和客户端初始化

  • 必须申请并获取ACCESS_FINE_LOCATION权限,getCurrentPlace()依赖精确位置权限,没有权限的话直接拿不到结果;
  • 确认mPlaceDetectionClient初始化正确,比如:
val mPlaceDetectionClient = PlaceDetectionClient.create(this)

第三步:正确处理结果

在onCompleteListener里要先判断任务是否成功,再遍历结果:

val placeResults = mPlaceDetectionClient.getCurrentPlace(placeFilter)
placeResults.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        task.result?.let { response ->
            if (response.placeLikelihoods.isEmpty()) {
                // 当前位置附近没有检测到餐厅,可以提示用户
                println("附近未找到餐厅,请确认位置或换个区域试试")
            } else {
                // 遍历所有匹配的餐厅,用于你的评分逻辑
                for (placeLikelihood in response.placeLikelihoods) {
                    val restaurant = placeLikelihood.place
                    println("找到餐厅:${restaurant.name},地址:${restaurant.address}")
                }
            }
        }
    } else {
        // 处理错误,比如权限未授权、Google服务不可用
        task.exception?.let { e ->
            println("获取场所失败:${e.message}")
        }
    }
}

额外注意点

  • 如果测试时返回空结果,先打开Google地图确认当前位置附近确实有餐厅;
  • 部分地区可能因Google服务覆盖问题导致结果不准确,建议在有稳定Google服务的环境下测试。

内容的提问来源于stack exchange,提问作者Joel Broström

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:27:49