使用Google Map Distance Matrix API时Duration返回空值的问题排查
巴士追踪App行程时长获取问题
我正在开发一款巴士追踪App,从Firebase收集位置数据,获取用户当前位置后调用Google Map Distance Matrix API获取预估行程时长。目前能正常获取两个位置信息,但Duration始终返回空值。
关键现象
- 直接传入硬编码的double类型坐标给
getCompleteAddress方法时(例如final String ORIGINS = getCompleteAddress(12.841,80.157)),代码可正常运行,Duration能正确返回值 - 通过getter方法获取坐标传入后,代码执行到T5日志后便停止,无法进入Duration非空判断
onResponse方法中打印的两个位置值正常且不相同
相关代码
private void getTravelTime() { final String API_KEY = "MyAPIKey"; final String ORIGINS = getCompleteAddress(l.getLatitue(),l.getLongitude()); final String DESTINATIONS = getCompleteAddress(l1.getLatitue(), l1.getLongitude()); GMapAPIService gMapAPIService = RetrofitService.getRetrofitClient().create(GMapAPIService.class); Call<DistanceMatrixResponse> call = gMapAPIService.getDistance(API_KEY, ORIGINS, DESTINATIONS); call.enqueue(new Callback<DistanceMatrixResponse>() { @Override public void onResponse(Call<DistanceMatrixResponse> call, Response<DistanceMatrixResponse> response) { Log.d("l", String.valueOf(l.getLatitue()+ " "+l.getLongitude())); Log.d("l1", String.valueOf(l1.getLatitue()+ " "+l1.getLongitude())); if (response.isSuccessful()) { DistanceMatrixResponse distanceMatrixResponse = response.body(); Log.d("T1","Here"); if (distanceMatrixResponse != null) { List<DistanceMatrixRow> rows = distanceMatrixResponse.getRows(); Log.d("T2","Here"); if (rows != null && !rows.isEmpty()) { Log.d("T3","Here"); DistanceMatrixRow distanceMatrixRow = rows.get(0); Log.d("D2",String.valueOf(distanceMatrixRow)); if (distanceMatrixRow != null) { Log.d("T4","Here"); DistanceMatrixElement distanceMatrixElement = distanceMatrixRow.getElements().get(0); Log.d("D2",String.valueOf(distanceMatrixElement)); if (distanceMatrixElement != null) { Log.d("T5","Here"); Duration duration = distanceMatrixElement.getDuration(); Distance d=distanceMatrixElement.getDistance(); Log.d("Duration:",String.valueOf(duration)); Log.d("Distance:",String.valueOf(d)); if (duration != null) { Log.d("T6","Here"); String travelTime = duration.getText(); textViewTravelTime.setText(travelTime); } } } } } } } @Override public void onFailure(Call<DistanceMatrixResponse> call, Throwable t) { Log.e("MainActivity", t.getMessage()); } }); }
日志输出情况
日志显示T1到T5均正常打印,但Duration:和Distance:对应的输出为null,T6日志未出现,说明API返回的结果中没有正确映射出Duration和Distance对象。
排查建议
- 检查
getCompleteAddress返回值格式:在赋值ORIGINS和DESTINATIONS后添加日志打印,对比硬编码时的字符串格式,确认是否存在多余空格、特殊字符或无效地址字符串,导致API无法识别起点/终点。 - 验证实体类字段映射:打印API返回的完整JSON内容,对比
Duration、Distance等实体类的字段名是否和JSON字段完全匹配(注意大小写和字段名一致性),避免Retrofit解析时无法映射字段。 - 直接测试API请求:将拼接好的API请求URL(包含实际的origins、destinations和API_KEY)在浏览器中访问,查看返回的JSON里是否存在duration字段,确认API本身是否返回有效数据。
- 确认坐标合法性:检查getter获取的经纬度是否在合法范围(纬度-9090,经度-180180),排除NaN或超出范围的数值导致地址解析失败。
内容的提问来源于stack exchange,提问作者Dzzz
相关产品推荐
相关产品推荐

