Places for Android API 已弃用替代方案
Posted
技术标签:
【中文标题】Places for Android API 已弃用替代方案【英文标题】:Places for Android API deprecated alternative 【发布时间】:2019-07-05 09:23:36 【问题描述】:我试图实现 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。没有任何效果,所以我联系了支持人员,他们的速度非常快(谢谢大家!)
您在尝试启用地方信息时收到错误的原因 对于 Android API,它已被弃用。地方功能 现在将通过启用 Places API 来涵盖适用于 android 的内容。
我询问了我的实现并得到了这个答复。
地点选择器也已被弃用。您可以安装 兼容性库以继续使用 Place Picker 直到 弃用期于 7 月 29 日结束。有关此的更多信息可以在此处显示为红色: https://developers.google.com/places/android-sdk/client-migration#place_picker
我现在在网上找到的文档有点混乱,哪些是弃用的,哪些不是?谁能指出这种功能的正确方向?
【问题讨论】:
Place Picker 客户端库兼容性库将于 7 月 29 日结束支持。我的解释是,如果您想使用 Place API,则必须构建自己的 UI/UX 我也在尝试新的 place api 并得到相同的错误“您的应用似乎没有启用 Places API for Android”。我在现有应用中使用 Place 和 Autocomplete Place,所以是否需要更改所有 API? Google 正在跟踪人们对在此处使用 Place Picker 小部件的兴趣:(Android) issuetracker.google.com/128304810, (ios) issuetracker.google.com/128304760。如果您有兴趣,请在链接的表格中填写您的用例和需求。 【参考方案1】:Google Places SDK for Android 已弃用,因此我们需要迁移 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;
希望这会有所帮助..
【讨论】:
PlacesClient 是用户可以在地图上选择一个点的 UI(Activity?)吗?所以当我不需要自动完成时,我可以使用它,对吗? 如何在地图上使用地点选择器? 请参考developers.google.com/places/android-sdk/… 没有其他教程提到我必须删除 gms:play-services,为我工作。谢谢! 此代码未显示默认 MapsActivity 以从地图中选择位置。此解决方案仅显示默认 SearchLocationActivity。【参考方案2】: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客户端库的迁移指南可以找到here
或者在我的 repo 中找到自定义实现 => NewGooglePlacesSDK
【讨论】:
【参考方案3】:尽管 Google 为 Places SDK 提供了新的 API,但由于新的计费政策,他们正在放弃对 Place Picker 的支持,并且有两种选择如何处理这个问题。
您可以使用新的 SDK 自行实现此逻辑。
或者幸运的是,有这个 Ping Place Picker 库可以模仿 旧的 Place Picker 的行为。
【讨论】:
【参考方案4】:您可以使用Leku 来替代 Google 地点选择器。这是一个易于使用的库,可以满足您的需求。
只需要添加依赖即可:
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")
你可以走了。 ;)
【讨论】:
看起来不错! 图书馆看起来很棒!但是,从安全角度来看,将 google API 密钥传递给第三方库可以吗?以上是关于Places for Android API 已弃用替代方案的主要内容,如果未能解决你的问题,请参考以下文章
Android Google Places API,getAutocompletePredictions 返回状态“PLACES_API_ACCESS_NOT_CONFIGURED”
Android:在 android Places Api 中提供自动自动建议?
如何使用 Android Places API AutocompleteFilter
Android google Places API超出了每日配额
Google Places Api iOS Daily Limit for Unauthenticated Use Exceeded 错误