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
相关产品推荐
相关产品推荐

