Моя цель для этой программы состояла в том, чтобы опросить Google Directions API и построить курс с помощью Polyline на MapView в приложении для Android.
Однако, когда я получаю ответ DirectionsResult
из вызова API, попытка доступа к 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;
}
Мой процесс отладки:
Это мой печатный URL-адрес запроса:
Очевидно, это короткий, но полный звонок. С элементами ног, содержащими точки полилинии (это то, что я предполагаю, что мне нужно). Этот JSON совпадает с ответом, который я получил при чтении httpResponse.parseAsString()
.
Глядя на некоторые вопросы StackExchange, я увидел, что некоторые люди предлагали дождаться получения данных. Я поставил 1-секундные задержки между всеми неотъемлемыми частями цикла запроса без каких-либо результатов.
Ни одна из других частей вызова не была нулевой.
httpResponse.getStatusCode()
вернул 200.httpResponse.getStatusMessage()
вернул ОК.
Все кажется нормальным, пока я не попытаюсь использовать DirectionsResult
для анализа JSON HttpResponse
с помощью:
DirectionsResult directionsResult = HttpResponse.parseAs(DirectionsResult.class);
После чего я получаю NullPointerException при доступе к двум полям DirectionsResult
: routes
и geocodedWaypoints
.
У кого-нибудь были подобные проблемы с этим классом? Я подумал, что могу сообщить о проблеме на соответствующей странице библиотеки google-http-client GitHub, если она не решена здесь.