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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:42:46