Android Google Places API,getAutocompletePredictions 返回状态“PLACES_API_ACCESS_NOT_CONFIGURED”

Posted

技术标签:

【中文标题】Android Google Places API,getAutocompletePredictions 返回状态“PLACES_API_ACCESS_NOT_CONFIGURED”【英文标题】:Android Google Places API, getAutocompletePredictions returns status 'PLACES_API_ACCESS_NOT_CONFIGURED' 【发布时间】:2015-10-05 15:06:58 【问题描述】:

我在使用 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();

提前致谢

【问题讨论】:

您是否在开发者控制台中启用了适用于 Android 的 Google Places API?它与地图的 API 不同。您还应该检查您的公共 API 访问权限仍然存在的凭据。我昨天遇到了这个问题,我的钥匙刚刚消失了 谢谢@schopy 这里同样的关键问题 我遇到了类似的问题,但不完全相同。 ***.com/questions/31640783/…。任何人,请帮忙。 自 2019 年 1 月 29 日起,Google Play Services 版本的 Places SDK for Android 似乎已弃用。我将依赖项更改为 implementation 'com.google.android.libraries.places:places-compat:1.0.0'。我也在清单文件中添加了 API 密钥。但我仍然收到错误PLACES_API_ACCESS_NOT_CONFIGURED。关于如何解决它的任何想法? 【参考方案1】:

除了按照其他人的说明设置 API 密钥和启用 API 之外,我还必须执行以下操作:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

有两种方法可以通过 Intent 或 AutocompleteFragment 让您的 Place API 工作, 如果有意图,您可以将搜索限制在特定国家/地区,但同样不适用于 AutocompleteFragment。以下是对我有用的代码:

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

活动代码:

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

【讨论】:

【参考方案4】:

嗨朋友们,我已经成功解决了这个问题。我正在我的应用程序中实现自动完成 Goole 地点。这是由 Google Play 服务提供的。现在的主要问题是 1 月 29 日,Google Play 服务已弃用 Place SDK for Android。现在,发布了新的 SDK,而不是。为 Android 放置 sdk。现在您可以使用此迁移指南在您的项目中实现 place sdk。链接在这里。

Place SDK for Android migration guide.

另请参阅如何在您的项目中实现自动完成的分步指南。看这里这个链接step by step guide to implement Autocomplete in our app.

希望这对你有帮助。谢谢.....

【讨论】:

我成功解决了。【参考方案5】:

经过大量搜索和花费大量时间,我发现我们需要更换 从 实施 '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

【讨论】:

谢谢。这真的很有帮助 我把它改成了implementation 'com.google.android.libraries.places:places-compat:1.0.0'。我也在清单文件中添加了 API 密钥。但我仍然收到错误PLACES_API_ACCESS_NOT_CONFIGURED。关于如何解决它的任何想法? @harshpamnani 你有解决办法吗? 是的。该解决方案对我有用。如果您遇到任何问题,请告诉我。【参考方案6】:

我认为您尝试启用 适用于 Android 的 Google Places API

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

下方找到此内容
Google Places API Web Service

【讨论】:

【参考方案7】:

googleApiClient.connect();应该在接口OnMapReadyCallback的onMapReady方法中调用。

【讨论】:

【参考方案8】:

我遵循的逐步解决方案:

去https://console.developers.google.com/

打开您的项目并点击左侧标签中的

现在在 Mobile APIs 中点击 Google Places API for Android启用 api

【讨论】:

我已经这样做了,问题是,PLACES_API_ACCESS_NOT_CONFIGURED,但是 ApiKey 已经在那里了! Omg... 你会认为创建一个 Android 密钥并为 Places 和 Maps 添加限制意味着这些密钥可以为它们工作...但是在完全不同的地方隐藏了单独的启用按钮页面 smh.【参考方案9】:

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

【讨论】:

非常感谢,我为了这件事浪费了我的全部精力。 现在我们必须专门使用 Places SDK for Android Nirzon,您能否说明如何启用 Place SDK for Android?启用 API 并查询“Place SDK for Android”时,Google 仅返回“Places API”,这一直给我 PLACES_API_ACCESS_NOT_CONFIGURED 9003 错误。谢谢

以上是关于Android Google Places API,getAutocompletePredictions 返回状态“PLACES_API_ACCESS_NOT_CONFIGURED”的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Android 的 Google Places API 未显示

获取适用于 Android 的 Google Places API 密钥

适用于 Android 的 Google Places API:地图立即消失

Google Places API Android:自动完成关闭太快

Android Google Places API - PlaceAutocompleteFragment 清除按钮监听器

如何为我的 Android 应用获取 Google Places API 密钥