0

このプログラムの私の目標は、Google Directions API をポーリングし、Android アプリの MapView で Polyline によってコースをプロットすることでした。

ただし、DirectionsResultAPI 呼び出しから返されると、アクセスしようとすると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;
}

私のデバッグプロセス:

  1. これは私の印刷されたリクエスト URL です。

    http://maps.googleapis.com/maps/api/directions/json?origin=40.426870,-86.925083&destination=40.430092,-86.921679&sensor=true

明らかに、それは短いが完全な呼び出しです。ポリラインポイントを含む脚の要素を使用します(これが私が求めているものだと思います)。この JSON は、読み取りから得た応答と同じhttpResponse.parseAsString()です。

  1. StackExchange の質問をいくつか見てみると、データが受信されるのを待つことを提案する人もいました。リクエストサイクルのすべての不可欠な部分の間に1秒の遅延を置きましたが、結果はありません。

  2. 呼び出しの他の部分はどれも null ではありませんでした。

  3. httpResponse.getStatusCode()200を返しました。

  4. httpResponse.getStatusMessage()OKを返しました。

DirectionsResult以下を使用して JSON を解析しようとするまで、すべてが正常に表示されますHttpResponse

DirectionsResult directionsResult = HttpResponse.parseAs(DirectionsResult.class);

DirectionsResultその後、 :routesとの 2 つのフィールドにアクセスすると NullPointerException が発生しgeocodedWaypointsます。

このクラスで同様の問題が発生した人はいますか? ここで解決されない場合は、適切な google-http-client ライブラリの GitHub ページに問題を提出するかもしれないと考えていました。

4

1 に答える 1

0

つまり、私が正しく行っていなかったことが 2 つあります。

まず、URLに API キーを含めませんでした。これは、正しい形式の JSON 応答を で出力できた理由を説明していませんがhttpRequest.parseAsString()、明らかに、Google 開発者アカウントの適切な請求のために API キーを含める必要があります。この結果として行う必要があったもう 1 つの変更は、URL を「http」から「https」に変更することです。

次に、サーバー API キーではなく Android 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 ではなくサーバー オプションを選択します。

于 2016-02-29T19:08:08.860 に答える