Android平台HERE SDK调用路由API遇404错误求助
HERE SDK Explorer Edition(Android)调用Routes API出现404错误的解决方法
问题现象
- 网页浏览器直接调用HERE Routes API可正常返回结果
- Android应用中通过SDK的
importRoute()方法导入路由时,抛出错误:Routing error: 1, exception: Requested resource not found, error code: 404
用户使用的API请求地址
https://router.hereapi.com/v8/routes?apikey=-YOUR_API_KEY&origin=52.524465%2C13.382334&destination=52.525301%2C13.399844&return=polyline%2Csummary%2Cactions%2Cinstructions%2CrouteHandle&transportMode=car
用户当前的错误代码
routingEngine.importRoute( new RouteHandle(apiCall), // 错误:直接传入完整API请求URL new RefreshRouteOptions(TransportMode.CAR), new CalculateRouteCallback() { @Override public void onRouteCalculated(@Nullable RoutingError routingError, @Nullable List<Route> routes) { if (routingError == null) { Route route = routes.get(0); showRouteDetails(route); showRouteOnMap(route); getManeuverInstructions(route); logRouteViolations(route); } else { Log.e("Error while calculating a route:", routingError.toString()); } } } );
问题原因
RouteHandle构造函数需要传入的是Routes API返回结果中的routeHandle字段值,而非完整的API请求URL。直接传入API调用地址会导致SDK无法识别目标资源,从而返回404错误。
修正步骤
- 通过HTTP请求调用Routes API,获取响应体中的
routeHandle字符串(需确保请求参数包含return=routeHandle) - 将获取到的
routeHandle字符串传入RouteHandle构造函数,再调用importRoute()方法
修正后的代码示例
// 1. 先通过网络请求获取routeHandle(示例用OkHttp,可根据实际框架调整) OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://router.hereapi.com/v8/routes?apikey=YOUR_API_KEY&origin=52.524465%2C13.382334&destination=52.525301%2C13.399844&return=routeHandle&transportMode=car") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { e.printStackTrace(); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { if (response.isSuccessful() && response.body() != null) { String responseBody = response.body().string(); // 解析JSON获取routeHandle(示例用Gson,可根据实际解析库调整) RouteApiResponse routeResponse = new Gson().fromJson(responseBody, RouteApiResponse.class); String routeHandleStr = routeResponse.routes.get(0).routeHandle; // 2. 在主线程调用SDK的importRoute方法 runOnUiThread(() -> { routingEngine.importRoute( new RouteHandle(routeHandleStr), new RefreshRouteOptions(TransportMode.CAR), new CalculateRouteCallback() { @Override public void onRouteCalculated(@Nullable RoutingError routingError, @Nullable List<Route> routes) { if (routingError == null) { Route route = routes.get(0); showRouteDetails(route); showRouteOnMap(route); getManeuverInstructions(route); logRouteViolations(route); } else { Log.e("Route Error", routingError.toString()); } } } ); }); } } }); // 辅助解析用的实体类 class RouteApiResponse { List<RouteData> routes; class RouteData { String routeHandle; } }
注意事项
- 确保AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" /> - 确认API Key有效且权限覆盖路由相关服务
RefreshRouteOptions中的TransportMode需与Routes API请求的transportMode参数一致- 保证SDK版本与参考文档版本(4.13.5.0)匹配
内容的提问来源于stack exchange,提问作者Addict of Rice
相关产品推荐
相关产品推荐

