此计划的目标是浏览Google Directions API,并在Android应用中的MapView上按Polyline绘制课程。
但是,当我从API调用中返回DirectionsResult
时,尝试访问directionsResult.routes[0]
或directionsResult.geocodedWaypoints[0]
会导致 NullPointerException 。
我目前正在使用maven存储库导入以下库(摘自我的build.gradle):
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.google.http-client:google-http-client-android:1.21.0'
compile 'com.google.http-client:google-http-client-jackson:1.21.0'
compile 'com.google.http-client:google-http-client-jackson2:1.21.0'
compile 'com.google.http-client:google-http-client-gson:1.21.0'
compile 'com.google.http-client:google-http-client-protobuf:1.21.0'
compile 'com.google.http-client:google-http-client:1.21.0'
compile 'com.google.maps:google-maps-services:0.1.10'
compile 'com.google.android.gms:play-services:8.4.0'
我在调试调用的AsyncTask实现中的当前代码已注释掉:
@Override
protected synchronized String doInBackground(URL... params)
{
try {
HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory(new HttpRequestInitializer() {
@Override
public void initialize(HttpRequest request) throws IOException {
request.setParser(new JsonObjectParser(JSON_FACTORY));
}
});
GenericUrl url = new GenericUrl("http://maps.googleapis.com/maps/api/directions/json");
// to and from are both LatLng's
url.put("origin", from.toUrlValue());
url.put("destination", to.toUrlValue());
url.put("sensor", true);
HttpRequest request = requestFactory.buildGetRequest(url);
//wait(1000);
HttpResponse httpResponse = request.execute();
//Log.i(TAG, httpResponse.parseAsString());
//wait(1000);
DirectionsResult directionsResult = httpResponse.parseAs(DirectionsResult.class);
//wait(1000);
//Log.i(TAG, Integer.toString(httpResponse.getStatusCode()));
//Log.i(TAG, httpResponse.getStatusMessage());
latlngs = directionsResult.routes[0].overviewPolyline.decodePath();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
这是我的打印请求网址:
显然这是一个简短而完整的电话。腿的元素包含折线点(这是我假设我之后)。此JSON与我从阅读httpResponse.parseAsString()
得到的响应相同。
看一些StackExchange问题,我看到有人建议等待收到数据。我在请求周期的所有组成部分之间放置了1秒的延迟而没有结果。
调用的其他部分均无效。
httpResponse.getStatusCode()
返回200。
httpResponse.getStatusMessage()
返回确定。
在尝试使用DirectionsResult
解析JSON HttpResponse
之前,所有内容都显得正常:
DirectionsResult directionsResult = HttpResponse.parseAs(DirectionsResult.class);
在访问DirectionsResult
:routes
和geocodedWaypoints
的两个字段后,我收到NullPointerException。
有没有人在这堂课上遇到过类似的问题?我一直在想如果在这里没有解决这个问题,我可能会在正确的google-http-client库GitHub页面上提交一个问题。
答案 0 :(得分:0)
事实证明,有两件事我做得不对。
首先,我在网址中没有包含API密钥,这无法解释为什么我能够使用httpRequest.parseAsString()
打印格式正确的JSON响应,但无论如何显然都是API密钥需要包含以便对我的Google Developer帐户进行正确计费。因此需要进行的另一项更改是将URL从“http”更改为“https”。
其次,请求Android API密钥而不是服务器API密钥似乎存在问题。我在使用Android API密钥时收到了此回复:
{
"error_message" : "This IP, site or mobile application is not authorized to use this API key. Request received from IP address 128.210.106.49, with empty referer",
"routes" : [],
"status" : "REQUEST_DENIED"
}
作为解决方案,在创建API密钥时,请选择“服务器”选项而不是Android。