Android Google Places API,getAutocompletePredictions返回状态'PLACES_API_ACCESS_NOT_CONFIGURED'

时间:2015-07-16 08:53:59

标签: android google-places-api

我遇到Android Google Places API问题 - 自动完成功能。 我使用的是与Android Google Maps API相同的密钥(在文档中,写的是可以的)。这是我在清单中的定义:

<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();

提前致谢

9 个答案:

答案 0 :(得分:51)

在开发者控制台中启用适用于Android的Google Places API,并检查您的密钥仍然存在的凭据页面

答案 1 :(得分:25)

我一步一步解决的问题:

enter image description here

答案 2 :(得分:1)

我认为您尝试启用 Google Places API for Android

启用它也可以。您可以在 Google Places API for Android

下找到此信息
Google Places API Web Service

答案 3 :(得分:1)

嗨,朋友们,我已经成功解决了这个问题。我正在应用中实现“自动完成Goole”场所。这是由Google Play服务提供的。现在的主要问题是,Google Play服务已于1月29日弃用了适用于Android的Place SDK。将SDK放入Android。现在,您可以使用此迁移指南在项目中实现Place sdk。链接在这里可用。

Place SDK for Android migration guide.

另请参阅分步指南,了解如何在项目中实现自动完成。在此处查看此链接step by step guide to implement Autocomplete in our app.

希望这会对您有所帮助。谢谢.....

答案 4 :(得分:1)

经过大量搜索和花费大量时间,我发现我们需要更换 从 实施'com.google.android.gms:play-services-places:15.0.1'

替换为 实施'com.google.android.libraries.places:places-compat:1.0.0'

代码演示可在以下位置找到: https://github.com/googlemaps/android-places-demos

答案 5 :(得分:0)

应该在OnMapReadyCallback接口的onMapReady方法中调用

googleApiClient.connect();

答案 6 :(得分:0)

有两种方法可以使Intent或AutocompleteFragment发挥您的Place API的作用, 在有意向的情况下,您可以将搜索限制在特定的国家/地区,但这不适用于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);

        }
    };

}

意图活动类

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(this@AutocompleteActivity, "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文件中 试试这个,它应该工作!!! :)

答案 7 :(得分:0)

您可以使用这个版本的places api作为依赖项。

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

答案 8 :(得分:0)

除了设置API密钥并启用其他人提到的API之外,我还必须执行以下操作:

  1. 设置帐单帐户(我收到“超出最大限制...”错误
  2. 切换到使用Places SDK客户端库,如下所示:https://developers.google.com/places/android-sdk/client-migration。 (请注意,由于Google Play Services版本的Android版Places SDK将在2019年7月29日关闭,因此我没有选择使用兼容性库。)