11

我试图实现 Places API。我的代码如下所示:

val builder = PlacePicker.IntentBuilder()
startActivityForResult(builder.build(mActivity), PLACE_PICKER_REQUEST)

我的地图凭据是正确的,但我接到了这个电话

您的应用似乎未启用 Places API for Android。有关更多详细信息,请参阅https://developers.google.com/places/android/signup

但是,当我尝试启用“Places API for Android”时,我收到了这个错误。

您没有足够的权限查看此页面。

我尝试注销我的帐户,再次登录,隐身模式,Safari 和 Chrome。没有任何效果,所以我联系了支持,速度非常快(谢谢大家!)

您在尝试启用 Places for Android API 时收到错误的原因是它已被弃用。现在将通过启用 Places API 来涵盖 Android 的 Places 功能。

我询问了我的实施并得到了答复。

地点选择器也已被弃用。您可以安装兼容性库以继续使用 Place Picker,直到弃用期于 7 月 29 日结束。有关这方面的更多信息可以在此处显示为红色: https ://developers.google.com/places/android-sdk/client-migration#place_picker

我现在在网上找到的文档有点混乱,什么是弃用的,什么不是?谁能为我指出这种功能的正确方向?

4

4 回答 4

22

适用于 Android 的 Google Places SDK 已弃用,因此我们需要迁移Places API。要使用新的 Places API 实现AutoComplete Place .. 请按照以下步骤操作。

首先在开发者控制台中启用 PlacesAPI,然后通过在 gradle 中更新来安装客户端库。

(注意:您只能安装客户端库或兼容性库,不能同时安装)

implementation 'com.google.android.libraries.places:places:1.0.0'

现在在 Oncreate() 中初始化下面的代码;

 // Add an import statement for the client library.
    import com.google.android.libraries.places.api.Places;

    // Initialize Places.
    Places.initialize(getApplicationContext(), "***YOUR API KEY***");

   // Create a new Places client instance.
   PlacesClient placesClient = Places.createClient(this);

新 PlacesAPI 已初始化..

对于自动完成的地方使用下面的代码(你也可以使用自动完成片段)

// Set the fields to specify which types of place data to return.
List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME);
// Start the autocomplete intent.
Intent intent = new Autocomplete.IntentBuilder(
        AutocompleteActivityMode.FULLSCREEN, fields)
        .build(this);
startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Place place = Autocomplete.getPlaceFromIntent(data);
            Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
        } else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
            // TODO: Handle the error.
            Status status = Autocomplete.getStatusFromIntent(data);
            Log.i(TAG, status.getStatusMessage());
        } else if (resultCode == RESULT_CANCELED) {
            // The user canceled the operation.
        }
    }
}
  • 确保清单中的权限
  • 生成的 API 密钥。
  • 在开发控制台中启用了 Places API。

删除(如果您添加了)

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

需要的头文件

import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.api.net.PlacesClient;
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;

希望这会有所帮助..

于 2019-03-07T14:09:02.513 回答
1

作为 Google Place Picker 的替代品,您可以使用Leku。这是一个易于使用的库,可以满足您的需求。

您只需要添加依赖项:

dependencies {
    implementation 'com.schibstedspain.android:leku:7.0.0'
}

在清单上声明活动:

<activity
    android:name="com.schibstedspain.leku.LocationPickerActivity"
    android:label="@string/leku_title_activity_location_picker"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"
    android:windowSoftInputMode="adjustPan"
    android:parentActivityName=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
        android:resource="@xml/leku_searchable" />
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

在您需要的地方开始活动:

val locationPickerIntent = LocationPickerActivity.Builder()
    .build(applicationContext)

startActivityForResult(locationPickerIntent, MAP_BUTTON_REQUEST_CODE)

最后,处理结果:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (resultCode == Activity.RESULT_OK && data != null) {
        Log.d("RESULT****", "OK")
        if (requestCode == 1) {
            val latitude = data.getDoubleExtra(LATITUDE, 0.0)
            Log.d("LATITUDE****", latitude.toString())
            val longitude = data.getDoubleExtra(LONGITUDE, 0.0)
            Log.d("LONGITUDE****", longitude.toString())
            val address = data.getStringExtra(LOCATION_ADDRESS)
            Log.d("ADDRESS****", address.toString())
            val postalcode = data.getStringExtra(ZIPCODE)
            Log.d("POSTALCODE****", postalcode.toString())
            val bundle = data.getBundleExtra(TRANSITION_BUNDLE)
            Log.d("BUNDLE TEXT****", bundle.getString("test"))
            val fullAddress = data.getParcelableExtra<Address>(ADDRESS)
            if (fullAddress != null) {
                Log.d("FULL ADDRESS****", fullAddress.toString())
            }
            val timeZoneId = data.getStringExtra(TIME_ZONE_ID)
            Log.d("TIME ZONE ID****", timeZoneId)
            val timeZoneDisplayName = data.getStringExtra(TIME_ZONE_DISPLAY_NAME)
            Log.d("TIME ZONE NAME****", timeZoneDisplayName)
        } else if (requestCode == 2) {
            val latitude = data.getDoubleExtra(LATITUDE, 0.0)
            Log.d("LATITUDE****", latitude.toString())
            val longitude = data.getDoubleExtra(LONGITUDE, 0.0)
            Log.d("LONGITUDE****", longitude.toString())
            val address = data.getStringExtra(LOCATION_ADDRESS)
            Log.d("ADDRESS****", address.toString())
            val lekuPoi = data.getParcelableExtra<LekuPoi>(LEKU_POI)
            Log.d("LekuPoi****", lekuPoi.toString())
        }
    }
    if (resultCode == Activity.RESULT_CANCELED) {
        Log.d("RESULT****", "CANCELLED")
    }
}

你可以走了。;)

于 2020-05-25T14:21:12.710 回答
1

尽管 Google 为 Places SDK 提供了新的 API,但由于新的计费政策,他们正在放弃对 Place Picker 的支持,并且有两种选择如何处理这个问题。

  1. 您可以使用新的 SDK 自行实现此逻辑。

  2. 或者幸运的是,这个Ping Place Picker库模仿了旧 Place Picker 的行为。

于 2019-07-12T09:18:32.903 回答
0

Google Play Services 版本的 Places SDK for Android(在 Google Play Services 16.0.0 中)已于 2019 年 1 月 29 日弃用,并将于 2019 年 7 月 29 日关闭。如果您在 google API 控制台下查看,它只有 PLACES API,再也没有 PLACES SDK FOR ANDROID 之类的东西了。

可在此处找到新地方 SDK 客户端库的迁移指南

或者在我的仓库中找到自定义实现 => NewGooglePlacesSDK

于 2019-05-30T09:22:38.060 回答