Android Studio中基于经纬度获取两点距离与时长问题求助
解决Google Directions API因地点无法识别导致的代码异常问题
嘿,我来帮你捋捋这个问题!你遇到的核心问题是Google Directions API无法识别你传入的起点/终点位置——因为没有明确的路线名称或足够的定位信息,API返回的响应里routes数组是空的,而你的代码直接去取routes.getJSONObject(0),自然就会抛出JSONException,导致代码崩溃。
下面是具体的解决方案和优化后的代码:
第一步:先排查API响应的问题
在onResponse方法里先打印完整的响应内容,看看API返回的状态是什么,方便定位问题:
Log.e("API_RESPONSE", response.body().toString());
如果返回的status字段是NOT_FOUND,那就实锤了——API找不到你传入的起点或终点。
第二步:给代码加上安全判断
绝对不能假设routes数组一定有内容,必须先判断长度,再进行后续操作,避免空指针或数组越界异常:
private void getPrice(String mLocation, String mDestination) { String requestUrl= null; try { requestUrl = "https://maps.googleapis.com/maps/api/directions/json?" + "mode=driving&transit_routing_preference=less_driving&" + "origin="+mLocation+"&destination="+mDestination+"&" + "key="+getResources().getString(R.string.google_browser_key); Log.e("LINK",requestUrl); mService.getPath(requestUrl).enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, Response<String> response) { try { JSONObject jsonObject = new JSONObject(response.body().toString()); // 打印完整响应,方便排查问题 Log.e("API_RESPONSE", jsonObject.toString()); // 先检查API返回的状态码 String status = jsonObject.getString("status"); if (!"OK".equals(status)) { txtCalculate.setText("获取路线失败:" + status); return; } JSONArray routes = jsonObject.getJSONArray("routes"); // 必须判断routes是否为空,再继续操作 if (routes.length() == 0) { txtCalculate.setText("无法识别起点或终点位置,请检查输入"); return; } JSONObject object = routes.getJSONObject(0); JSONArray legs = object.getJSONArray("legs"); JSONObject legsObject = legs.getJSONObject(0); JSONObject distance = legsObject.getJSONObject("distance"); String distance_text = distance.getString("text"); Double distance_value = Double.parseDouble(distance_text.replaceAll("[^0-9\\.]+","")); JSONObject time = legsObject.getJSONObject("duration"); String time_text = time.getString("text"); Integer time_value = Integer.parseInt(time_text.replaceAll("\\D+","")); String final_calculate = String.format("%s + %s = $%.2f",distance_text,time_text, Common.getPrice(distance_value,time_value)); txtCalculate.setText(final_calculate); } catch (JSONException e) { e.printStackTrace(); txtCalculate.setText("解析路线数据出错"); } } @Override public void onFailure(Call<String> call, Throwable t) { Log.e("ERROR",t.getMessage()); txtCalculate.setText("网络请求失败"); } }); } catch (Exception ex) { ex.printStackTrace(); txtCalculate.setText("请求参数出错"); } }
第三步:优化地点参数的传入方式
Google Directions API对地点参数的识别优先级是:
- 经纬度(比如
37.7749,-122.4194):最准确,不会出错; - 详细地址(比如“北京市朝阳区建国门外大街1号”):识别率高;
- 模糊地点名:容易识别失败,尤其是没有路线名称的地点。
如果你的输入是模糊的地点名,建议先调用Google Geocoding API把名称转换成经纬度,再传入Directions API,这样能大幅提高识别成功率。
额外提醒
别忘了检查你的API Key:
- 确保在Google Cloud控制台启用了Directions API;
- 检查API Key的配额是否足够,有没有被限流;
- 确认API Key的限制条件(比如允许的包名、IP)是否符合你的应用场景。
内容的提问来源于stack exchange,提问作者Saouti Mohamed
相关产品推荐
相关产品推荐

