繁体   English   中英

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

[英]Android Google Places API, getAutocompletePredictions returns status 'PLACES_API_ACCESS_NOT_CONFIGURED'

我在使用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,并在凭据页面上检查您的密钥仍然存在

我遵循的分步解决方案:

  • 只需转到https://console.developers.google.com/

  • 打开您的项目,然后从左侧选项卡中单击

  • 现在在移动API中 ,点击适用于Android的Google Places API启用该API

在此处输入图片说明

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

同时启用它也可以。 您可以在适用于Android的Google Places API下找到此文件

Google Places API Web Service

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

Place SDK for Android迁移指南。

另请参阅分步指南,了解如何在您的项目中实现自动完成。请在此处查看此分步指南,以在我们的应用中实现自动完成。

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

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

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

有两种方法可以使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文件中。 :)

您可以将此版本的places api用作依赖项。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM