Google Maps Java Client GeocodingApi.reverseGeocode无返回结果问题
我之前也碰到过类似的问题,结合你的情况,大概率是几个常见原因导致的,咱们一步步来排查解决:
1. 先确认API密钥的配置是否正确
浏览器请求里你明确带了API密钥,但Java客户端如果没正确设置的话,请求会被拒绝或者返回空结果。你需要确保初始化GeoApiContext时传入了正确的密钥,而且这个密钥已经在Google Cloud控制台启用了Geocoding API权限:
// 正确初始化上下文 GeoApiContext context = new GeoApiContext.Builder() .apiKey("你的API密钥") // 要和浏览器请求里用的是同一个 .build(); // 调用逆地理编码 try { List<GeocodingResult> results = GeocodingApi.reverseGeocode( context, new LatLng(-3.775657, -38.456086) // 注意是纬度在前,经度在后,顺序别搞反 ).await(); if (results.isEmpty()) { System.out.println("无返回结果"); } else { // 打印第一个结果的格式化地址 System.out.println(results.get(0).formattedAddress); } } catch (Exception e) { e.printStackTrace(); // 这里一定要捕获异常,看具体错误信息 }
2. 你的客户端版本太旧了!
你用的0.2.7是2017年的老版本,和现在的Google Maps API存在兼容性问题,建议直接升级到最新稳定版。修改你的Gradle依赖:
dependencies { implementation 'com.google.maps:google-maps-services:2.2.0' // 最新稳定版 implementation 'org.slf4j:slf4j-simple:2.0.7' // 替换nop为simple,方便查看请求日志 }
3. 启用日志排查请求差异
你当前用的slf4j-nop会禁用所有日志,导致你看不到客户端实际发送的请求和服务器的响应状态(比如403权限错误、400参数错误)。换成slf4j-simple后,就能看到详细的请求URL、响应码和错误信息,对比浏览器的请求就能快速找到差异。
4. 别吞掉异常,查看具体错误原因
很多时候空结果是因为请求抛出了异常但被你忽略了,一定要用try-catch包裹调用代码,捕获ApiException、InterruptedException、IOException这几个异常:
ApiException:通常是API返回的业务错误,比如密钥无效、配额用完、API未启用IOException:网络问题,比如无法连接到Google服务器InterruptedException:请求被中断
按照这几步排查,应该能快速定位并解决你的问题。我之前就是因为用了老版本的客户端,加上没正确处理异常,折腾了好久才找到原因。
内容的提问来源于stack exchange,提问作者HFSDev
相关产品推荐
相关产品推荐

