このプログラムの私の目標は、Google Directions API をポーリングし、Android アプリの MapView で Polyline によってコースをプロットすることでした。
ただし、DirectionsResult
API 呼び出しから返されると、アクセスしようとするとNullPointerException が発生directionsResult.routes[0]
します。directionsResult.geocodedWaypoints[0]
現在、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秒の遅延を置きましたが、結果はありません。
呼び出しの他の部分はどれも null ではありませんでした。
httpResponse.getStatusCode()
200を返しました。httpResponse.getStatusMessage()
OKを返しました。
DirectionsResult
以下を使用して JSON を解析しようとするまで、すべてが正常に表示されますHttpResponse
。
DirectionsResult directionsResult = HttpResponse.parseAs(DirectionsResult.class);
DirectionsResult
その後、 :routes
との 2 つのフィールドにアクセスすると NullPointerException が発生しgeocodedWaypoints
ます。
このクラスで同様の問題が発生した人はいますか? ここで解決されない場合は、適切な google-http-client ライブラリの GitHub ページに問題を提出するかもしれないと考えていました。