Google размещает обратный вызов getPlaceById, который не вызывается

Я создаю приложение для Android, которое сохраняет идентификатор места, полученный из API PlaceAutocomplete. Позже я пытаюсь получить информацию о месте, используя API getPlaceById(). Я вижу, что обратный вызов никогда не вызывается.

Я установил следующее разрешение:

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

Я также добавил API_KEY:

       <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value=<API KEY>/>

Однако я не могу получить информацию о месте. «onResult», кажется, никогда не вызывается. Может ли кто-нибудь помочь мне с тем, где я могу ошибаться?

Спасибо!

Ниже приведен фрагмент кода, который я использую. Здесь для простоты жестко закодирован PlaceId:

    PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.getPlaceById(mGoogleApiClient, "ChIJi-t8KwUWrjsRlp-L9ykb2_k");
    placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
        @Override
        public void onResult(PlaceBuffer places) {
            Log.i(TAG, "Testing");
            if (places.getStatus().isSuccess() && places.getCount() > 0) {
                final Place myPlace = places.get(0);
                Log.i(TAG, "Place found: " + myPlace.getName());
            } else {
                Log.e(TAG, "Place not found");
            }
            places.release();
        }
    });

person Swapnil Mankar    schedule 11.01.2016    source источник
comment
Можете ли вы поделиться своим кодом, как вы создаете запрос GoogleApiClient?   -  person Kapil Rajput    schedule 11.01.2016
comment
@kapilrajput Вот как я создаю запрос: mGoogleApiClient = new GoogleApiClient .Builder(this) .addApi(Places.GEO_DATA_API) .addApi(Places.PLACE_DETECTION_API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build();   -  person Swapnil Mankar    schedule 11.01.2016
comment
@kapilrajput Спасибо за помощь :)   -  person Swapnil Mankar    schedule 11.01.2016
comment
Обратите внимание, что вам не нужно разрешение READ_GSERVICES для использования этого API. Вы скопировали это из образца где-то?   -  person Daniel Resnick    schedule 12.01.2016
comment
@DanielResnick Вы правы. Я удалил разрешение, и он все еще работает нормально. Сначала я сослался на ответ здесь (stackoverflow.com/questions/29744045/), в котором говорилось, что требуется разрешение.   -  person Swapnil Mankar    schedule 13.01.2016


Ответы (2)


Я только что узнал, что мне не хватало. Я пропустил вызов mGoogleApiClient.connect(); в onStart() активности. Теперь работает как шарм! :)

В комментарии к onCreate() в приведенной ниже ссылке говорится, что нам нужно явно вызвать connect() и разъединение(), если действие не расширяет FragmentActivity.

https://github.com/tangqi92/MyGooglePlaces/blob/master/app/src/main/java/itangqi/me/mygoogleplaces/MainActivity.java

person Swapnil Mankar    schedule 11.01.2016

У меня та же проблема. И на самом деле это не «не вызывается», а «еще не запущено». Вот мой неправильный код.

public void onClick(View v) {
    hideSoftKeyboard();
    Log.i("Search Click", "getting Place: " + mMyLocation.id);
    if(mMyLocation.id != null) {
        Places.GeoDataApi.getPlaceById(mGoogleApiClient, mMyLocation.id)
                .setResultCallback(new ResultCallback<PlaceBuffer>() {
                    @Override
                    public void onResult(PlaceBuffer places) {
                        if (places.getStatus().isSuccess() && places.getCount() > 0) {
                            LatLng coord = places.get(0).getLatLng();
                            mMyLocation.setLatLng(coord.latitude, coord.longitude);
                            Log.i("Place by id", "Place found: " + mMyLocation.coordinateString);
                        } else {
                            Log.e("Place by id", "Place not found");
                        }
                        places.release();

                    }
                });
    searchNearby();
    }
}

Функция searchNearby() использует mMyLocation, который должен был быть изменен в onResult. И он еще не был изменен, что означает, что onResult не вызывался до запуска searchNearby(). Затем я поместил функцию searchNearby() в onResult, и она заработала.

Итак, мое предложение: поместите в него все, что вы хотите запустить после onResult.

person Davion    schedule 07.05.2017