FindAutocompletePredictionsRequest是否收费及Places API成本优化咨询
1 FindAutocompletePredictionsRequest收费规则
该请求属于谷歌Places API的计费项,单独调用时会按Autocomplete - 按次请求规则收费,若你未使用会话令牌,后续调用Place API获取经纬度时会产生二次计费,两项费用叠加就是你当前成本过高的核心原因。
2 成本优化方案
2.1 官方最优优化方案(无需切换服务)
- 核心是使用Autocomplete会话令牌,将多次补全预测请求+1次Place详情请求绑定为同一个会话,整次会话仅收取1次Place详情费用,无需单独为补全预测请求付费
- 搭配字段过滤,仅请求你需要的经纬度字段,使用基础字段计费档位,进一步降低单请求成本
- 添加输入防抖逻辑,用户输入间隔小于300ms时不发起请求,减少无效请求量
Android端示例代码
首先在用户发起新的地点搜索时生成唯一会话令牌,不要跨搜索流程复用:
// 初始化Places客户端(全局只需初始化一次) if (!Places.isInitialized()) { Places.initialize(getApplicationContext(), "你的谷歌API_KEY"); } PlacesClient placesClient = Places.createClient(this); // 每次新的搜索流程生成新会话令牌 AutocompleteSessionToken sessionToken = AutocompleteSessionToken.newInstance();
构建补全预测请求时传入令牌:
FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder() .setSessionToken(sessionToken) .setQuery(userInputQuery) // 可选:添加位置过滤,减少无关返回结果 .setCountries("CN") // 限制仅返回中国地区结果 .build(); placesClient.findAutocompletePredictions(request) .addOnSuccessListener(response -> { List<AutocompletePrediction> predictions = response.getAutocompletePredictions(); // 渲染补全列表 }) .addOnFailureListener(exception -> { // 处理异常 });
用户选中某条补全结果后,请求Place详情时传入同一个令牌,仅请求经纬度字段:
// 用户选中的预测项 AutocompletePrediction selectedPrediction = predictions.get(selectedPosition); FetchPlaceRequest fetchRequest = FetchPlaceRequest.builder( selectedPrediction.getPlaceId(), Collections.singletonList(Place.Field.LAT_LNG) // 仅请求经纬度字段 ) .setSessionToken(sessionToken) .build(); placesClient.fetchPlace(fetchRequest) .addOnSuccessListener(fetchResponse -> { LatLng latLng = fetchResponse.getPlace().getLatLng(); // 拿到经纬度后直接销毁当前会话令牌,下次搜索重新生成 }) .addOnFailureListener(exception -> { // 处理异常 });
2.2 替代实现方案
如果上述优化后成本仍不符合预期,可根据业务场景选择替代方案:
- 针对国内业务:替换为高德/百度地图的地点Autocomplete服务,免费额度更高,商用计费成本比谷歌Places低60%以上
- 针对海外业务:可对接基于OpenStreetMap的Nominatim服务,离线部署后可完全免费使用,自动补全+经纬度查询只需一次请求,适合请求量高的场景
内容的提问来源于stack exchange,提问作者nilesh prajapati
相关产品推荐
相关产品推荐

