DirectionResult имеет нулевые маршруты и путевые точки - Google Directions API

Моя цель для этой программы состояла в том, чтобы опросить 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;
}

Мой процесс отладки:

  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. Ни одна из других частей вызова не была нулевой.

  3. httpResponse.getStatusCode() вернул 200.

  4. httpResponse.getStatusMessage() вернул ОК.

Все кажется нормальным, пока я не попытаюсь использовать DirectionsResult для анализа JSON HttpResponse с помощью:

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

После чего я получаю NullPointerException при доступе к двум полям DirectionsResult: routes и geocodedWaypoints.

У кого-нибудь были подобные проблемы с этим классом? Я подумал, что могу сообщить о проблеме на соответствующей странице библиотеки google-http-client GitHub, если она не решена здесь.


person bmaxfie    schedule 10.02.2016    source источник


Ответы (1)


Вот и получается, что было две вещи, которые я делал неправильно.

Во-первых, я не включил ключ API в URL-адрес, что не объясняет, почему я смог напечатать правильно отформатированный ответ JSON с помощью httpRequest.parseAsString(), но несмотря на это, очевидно, что ключ API должен быть включен для правильного биллинг моей учетной записи Google Developer. Еще одно изменение, которое необходимо было внести в результате этого, — изменение 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.

person bmaxfie    schedule 29.02.2016
comment
Привет, я получаю сообщение об ошибке java.lang.NullPointerException, когда получаю маршруты от источника к месту назначения для Directions API в Android. Не могли бы вы мне помочь? Заранее спасибо. - person Naveen; 10.06.2017