API Google Адресов Google, getAutocompletePredictions возвращает статус "PLACES_API_ACCESS_NOT_CONFIGURED"

У меня проблемы с API Google Адресов Google - функция автозаполнения. Я использую тот же ключ, что и для Android API Google Maps (и в документации написано, что все в порядке). Вот мое определение в манифесте:

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

Но getAutocompletePredictions возвращает сообщение 'PLACES_API_ACCESS_NOT_CONFIGURED' как статус.

Вот мой код Java:

GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
        .addApi(Places.GEO_DATA_API)
        .addApi(Places.PLACE_DETECTION_API)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();
googleApiClient.connect();

LatLngBounds latLngBounds = new LatLngBounds.Builder().
        include(SphericalUtil.computeOffset(latlon, RADIUS, 0)).
        include(SphericalUtil.computeOffset(latlon, RADIUS, 90)).
        include(SphericalUtil.computeOffset(latlon, RADIUS, 180)).
        include(SphericalUtil.computeOffset(latlon, RADIUS, 270)).build();

PendingResult<AutocompletePredictionBuffer> result = Places.GeoDataApi.getAutocompletePredictions(googleApiClient, constraint.toString(), latLngBounds, null);

AutocompletePredictionBuffer autocompletePredictions = result.await(Config.DATA_TIMEOUT, TimeUnit.MILLISECONDS);

Status status = autocompletePredictions.getStatus();
if (status.isSuccess()) {
    Iterator<AutocompletePrediction> iterator = autocompletePredictions.iterator();
    while (iterator.hasNext()) {
        AutocompletePrediction prediction = iterator.next();
        //... do stuff here ...
    }
}
else {
    Log.d(TAG, status.getStatusMessage());
}

autocompletePredictions.release();
googleApiClient.disconnect();

Заранее спасибо

Ответы

Ответ 1

Включите API Google Адресов для Android в консоли разработчика и проверьте на странице учетных данных, что ваш ключ все еще присутствует

Ответ 2

Шаг за шагом Решение, которое я следую:

  • Просто перейдите к https://console.developers.google.com/

  • откройте свой проект и нажмите Библиотека на вкладках слева.

  • Теперь в API для мобильных устройств нажмите API Google Адресов для Android и ENABLE. api

введите описание изображения здесь

Ответ 3

googleApiClient.connect(); следует вызывать в методе onMapReady интерфейса OnMapReadyCallback.

Ответ 4

Я думаю, вы попробовали включить API Google Адресов для Android

Включите это, и он работает. Вы можете найти это ниже API Google Адресов для Android

Google Places API Web Service

Ответ 5

Привет, друзья! Я успешно решил эту проблему. Я внедрял автозаполнение мест в своем приложении. Это было предоставлено сервисами Google Play. Теперь главная проблема заключается в том, что Place SDK для Android не поддерживается сервисами Google Play 29 января. Теперь вместо SDK выпущен новый SDK. Поместите SDK для Android. Теперь вы можете использовать это руководство по миграции для реализации места SDK в вашем проекте. Ссылка доступна здесь.

Поместите SDK для Android руководства по миграции.

Также см. Пошаговое руководство по внедрению автозаполнения в вашем проекте. Посмотрите здесь пошаговое руководство по ссылке , чтобы реализовать автозаполнение в нашем приложении.

Надеюсь, что это поможет вам. Спасибо.....

Ответ 6

После долгих поисков и затрат времени я обнаружил, что нам нужно заменить "Из реализации" com.google.android.gms: play-services-place: 15.0.1 '

Заменить на реализацию 'com.google.android.libraries.places: place-compat: 1.0.0'

Демонстрацию кода можно найти по следующему адресу: https://github.com/googlemaps/android-places-demos.

Ответ 7

Есть два способа заставить ваш API работать с помощью Intent или AutocompleteFragment, в случае намерения вы можете ограничить свой поиск определенной страной, но тот же пока не применим к AutocompleteFragment. ниже приведен код, который работал для меня:

  <fragment
        android:id="@+id/autocomplete_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

activityCode:

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.common.api.Status;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.widget.AutocompleteSupportFragment;
import com.google.android.libraries.places.widget.listener.PlaceSelectionListener;
import org.jetbrains.annotations.NotNull;

import java.util.Arrays;

public class AutocompleteFragmentActivity extends AppCompatActivity {
    private String TAG ="FRAGMENT_AUTOCOMPLETE";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_autocomplete_fragment);

        /**
         * Initialize Places. For simplicity, the API key is hard-coded. In a production
         * environment we recommend using a secure mechanism to manage API keys.
         */
        if (!Places.isInitialized()) {
            Places.initialize(getApplicationContext(), "API_KEY");
        }

// Initialize the AutocompleteSupportFragment.
        AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
                getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);

        assert autocompleteFragment != null;
        autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME));


        autocompleteFragment.setOnPlaceSelectedListener(placeSelectionListener);

    }
    PlaceSelectionListener placeSelectionListener = new PlaceSelectionListener() {


        @Override
        public void onPlaceSelected(@NonNull Place place) {
            Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
            Toast.makeText(AutocompleteFragmentActivity.this, place.getName()+", "+ place.getAddress(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(@NotNull Status status) {
            Log.i(TAG, "An error occurred: " + status);

        }
    };

}

класс активности для Intent

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.widget.Toast
import com.google.android.libraries.places.api.Places
import com.google.android.libraries.places.api.model.Place
import com.google.android.libraries.places.widget.Autocomplete
import com.google.android.libraries.places.widget.AutocompleteActivity
import com.google.android.libraries.places.widget.model.AutocompleteActivityMode
import java.util.*


class AutocompleteActivity : AppCompatActivity() {
    private var AUTOCOMPLETE_REQUEST_CODE = 0
    private var TAG: String = "AUTOCOMPLETE_ACTIVITY"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_autocomplete)

        if (!Places.isInitialized()){
            Places.initialize(this, "API_KEY")
        }
       // val placesClient = Places.createClient(this)
        val fields = Arrays.asList(Place.Field.ID, Place.Field.NAME,Place.Field.ADDRESS)


        val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields)
            .setCountry("NG")
            .build(this)

        startActivityForResult(intent,AUTOCOMPLETE_REQUEST_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == AUTOCOMPLETE_REQUEST_CODE){
            if (resultCode == Activity.RESULT_OK){
                val place = Autocomplete.getPlaceFromIntent(data!!)
                Log.i(TAG,"Place: "+ place.name + ", "+ place.id)
            }
            else if (resultCode == AutocompleteActivity.RESULT_ERROR){
                val status = Autocomplete.getStatusFromIntent(data!!)
                Log.i(TAG, status.statusMessage)
            }
            else if (resultCode == Activity.RESULT_CANCELED){
                Toast.makeText([email protected], "You cancelled the operation", Toast.LENGTH_LONG).show()

            }
        }
    }
}

Не забудьте добавить свои зависимости

dependencies {

    implementation 'com.google.android.gms:play-services-places:16.0.0'
    implementation 'com.google.android.libraries.places:places:1.0.0'
}

Чтобы это работало, вы должны добавить оба к своему файлу gradle. Попробуйте, это должно работать !!! :)

Ответ 8

Вы можете использовать эту версию мест API в качестве зависимости.

implementation 'com.google.android.libraries.places:places-compat:1.1.0'

Ответ 9

В дополнение к настройке ключа API и включению API, как отмечали другие, мне пришлось сделать следующее:

  1. Настройте платежный аккаунт (я получаю сообщение об ошибке "превышен максимальный лимит..."
  2. Перейдите к использованию клиентской библиотеки Places SDK, как описано здесь: https://developers.google.com/places/android-sdk/client-migration. (Обратите внимание, что я не решил использовать библиотеку совместимости, так как версия Places SDK для Android для Google Play будет отключена 29 июля 2019 года.)