0

我对这个程序的目标是轮询 Google Directions API 并在 Android 应用程序的 MapView 上通过折线绘制路线。

但是,当我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;
}

我的调试过程:

  1. 这是我打印的请求网址:

    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. 通话的其他部分都不是空的。

  3. httpResponse.getStatusCode()退回200。

  4. httpResponse.getStatusMessage()返回确定。

在我尝试使用DirectionsResult以下方法解析 JSON之前HttpResponse,一切看起来都很正常:

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

之后我在访问DirectionsResult:routesgeocodedWaypoints.

有人在这门课上遇到过类似的问题吗?我一直在想,如果这里没有解决,我可能会在正确的 google-http-client 库 GitHub 页面上提交问题。

4

1 回答 1

0

所以事实证明,有两件事我做的不对。

首先,我在 URL 中没有包含 API 密钥,这没有解释为什么我能够使用 打印格式正确的 JSON 响应httpRequest.parseAsString(),但无论如何显然需要包含 API 密钥才能正确计费我的 Google 开发人员帐户。因此需要进行的另一项更改是将 URL 从“http”更改为“https”。

其次,请求 Android API key 而不是 Server API key似乎存在问题。我在使用 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 密钥时,选择 Server 选项而不是 Android。

于 2016-02-29T19:08:08.860 回答