Android Place Picker 在启动后立即关闭
Posted
技术标签:
【中文标题】Android Place Picker 在启动后立即关闭【英文标题】:Android Place Picker closes immediately after launch 【发布时间】:2015-07-16 00:39:39 【问题描述】:我正在开发一个 android 应用程序作为项目的一部分,并且正在使用 Google Places API 来根据位置显示感兴趣的地方。我正在使用 PlacePicker Inentbuilder 来完成此操作。
但是,当应用程序运行时,地点选择器会启动,然后立即关闭(大约 1-2 秒)。
我已经实施了以下建议(我从其他答案中得到):
我已经为 android 应用程序生成了公共 API 密钥,并将其包含在应用程序清单的元数据标记中。
我已在开发者控制台上启用“Google Places API for android”API。
我在 build.gradle 的依赖项中包含了最新的播放服务版本。
我在下面包含了我的代码和 logcat。如果我需要添加任何其他内容,请告诉我。
Manifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sampath.project.project_v2" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.geo.api_key"
android:value="@string/google_api_key" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/google_api_key" />"
<activity
android:name=".LoginActivity"
android:label="@string/title_activity_login" >
</activity>
<activity
android:name=".PlacesSample"
android:label="@string/title_activity_places_sample" >
<meta-data
android:name="com.google.android.geo.api_key"
android:value="@string/google_api_key" />
</activity>
</application>
</manifest>
Build.gradle(app 模块 - 这是唯一的模块)
apply plugin: 'com.android.application'
android
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig
applicationId "com.sampath.project.project_v2"
minSdkVersion 16
targetSdkVersion 21
versionCode 1
versionName "1.0"
buildTypes
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
dependencies
//compile fileTree(include: ['*.jar'], dir: 'libs')
//compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.android.support:cardview-v7:22.1.1'
compile 'com.android.support:recyclerview-v7:22.1.1'
compile 'com.google.android.gms:play-services:7.3.0'
PlacesSample - 使用 Google Places API 的活动:
package com.sampath.project.project_v2;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.ui.PlacePicker;
public class PlacesSample extends AppCompatActivity
TextView getLocation;
int PLACE_PICKER_REQUEST = 1;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_places_sample);
getLocation = (TextView)findViewById(R.id.getLocTV);
getLocation.setClickable(true);
getLocation.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
Intent intent;
try
intent = builder.build(getApplicationContext());
startActivityForResult(intent, PLACE_PICKER_REQUEST);
System.out.println("start activity for result");
catch (GooglePlayServicesRepairableException e)
e.printStackTrace();
catch (GooglePlayServicesNotAvailableException e)
e.printStackTrace();
);
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.menu_places_sample, menu);
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item)
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings)
return true;
return super.onOptionsItemSelected(item);
protected void onActivityResult(int requestCode, int resultCode, Intent data)
System.out.println("onActivityResult");
if (requestCode == PLACE_PICKER_REQUEST)
if (resultCode == RESULT_OK)
Place place = PlacePicker.getPlace(data, this);
String toastMsg = String.format("Place: %s", place.getName());
Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
Logcat:
05-05 23:38:30.593 21408-21408/com.sampath.project.project_v2 I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@17e945c6 time:628772943
05-05 23:38:30.598 21408-21408/com.sampath.project.project_v2 I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@17e945c6 time:628772948
05-05 23:38:31.517 21408-21408/com.sampath.project.project_v2 I/Timeline﹕ Timeline: Activity_launch_request id:com.sampath.project.project_v2 time:628773867
05-05 23:38:31.527 21408-21408/com.sampath.project.project_v2 W/ResourceType﹕ For resource 0x01030224, entry index(548) is beyond type entryCount(9)
05-05 23:38:31.527 21408-21408/com.sampath.project.project_v2 W/ResourceType﹕ For resource 0x01030224, entry index(548) is beyond type entryCount(9)
05-05 23:38:31.636 21408-21408/com.sampath.project.project_v2 I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@2daadb0a time:628773986
05-05 23:38:33.869 21408-21408/com.sampath.project.project_v2 I/System.out﹕ start activity for result
05-05 23:38:34.227 21408-21408/com.sampath.project.project_v2 I/System.out﹕ onActivityResult
05-05 23:38:34.235 21408-21408/com.sampath.project.project_v2 I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@2daadb0a time:628776586
【问题讨论】:
你能提供你的全部代码吗?因为我也有同样的错误,无法从你的回答中解决。 你有什么解决方案@sampath janardhan? Google Play Services 版本的 Places SDK for Android(在 Google Play Services 16.0.0 中)自 2019 年 1 月 29 日起弃用,并将于 2019 年 7 月 29 日关闭。一个新的现在可以使用适用于 Android 的 Places SDK 版本。我们建议尽快更新到新版本。详情请见migration guide。 【参考方案1】:Francois Wouts 的解决方案有助于回答这个问题。谢谢弗朗索瓦...
我使用关键字“Places”搜索日志,发现 Places API 确实抛出了异常。它期望在 Manifest.xml 中的 <application>
标记中包含 com.google.android.geo.API_KEY
。
我在<activity>
标记中更改为com.google.android.geo.API_KEY
,而不是<application>
标记中的那个。
现在更改为 com.google.android.geo.API_KEY
并从 <activity>
标记中删除相同的行,并使其正常工作。没有自己解决这个问题,感觉自己像个白痴..
元数据标签应为
android:name="com.google.android.geo.API_KEY"
它应该在 Manifest 中的<application>
标记内。
【讨论】:
我在 下有它,但仍然无法正常工作。 当我们从 google 的开发者控制台生成 API 密钥时,我们应该启用诸如 GeoCode、PlaceSearch 等 API。我的经验:我曾尝试在未启用 API 的情况下使用 placeautocomplete,因此在尝试时它会立即关闭打开它。然后我启用了它,它工作正常。【参考方案2】:您是否在Developer Console 中仔细检查过您的 API 密钥是否与您的应用程序(包名称和应用程序证书的 SHA-1 指纹)相关联?
您可以在Signup and API Keys 找到说明。确保为您的调试证书和发布证书设置它。
希望对你有帮助!
【讨论】:
我进行了仔细检查以确保 API 密钥关联与我的应用程序正确。我现在添加了发布证书,但没有任何区别。 我还在您的清单中看到您使用了com.google.android.geo.api_key
。你可以试试com.google.android.geo.API_KEY
吗?来源:developers.google.com/places/android/start#api-key
我尝试更改为 com.google.android.geo.API_KEY。有相同的结果。 (也已删除 com.sampath.project.project_v2.API_KEY 并获得相同的结果)。注意:我尝试运行 google 放在 github 上的示例代码。结果相同。所以我猜测 API 本身存在一些问题。如果有人可以在您的系统上运行示例代码并验证它是否不起作用,我将不胜感激。 Link to code samples
您上面提供的日志是由您的应用程序包过滤的。但是,地点选择器在您的应用程序之外运行(在 Google Play 服务中),因此错误消息不会出现在此处。您可以使用“无过滤器”而不是“仅显示选定的应用程序”吗?我建议在您的日志中查找“E/Place”。
当为 keyrestriction 调试 api 密钥无法正常工作时。当我生成签名 apk 并为带有包名和 sha1 的 android 应用程序添加密钥限制时,显示异常无效 api 密钥意外响应代码 403【参考方案3】:
我遇到了同样的问题。确保您在 Developer Console 中启用 Google Places API for Android 而不仅仅是 Places API。 “Places API for Android”不会出现在 APIs & Auth/APIs 下,因为它还不是流行的 API。您必须使用 API 搜索框搜索它。
【讨论】:
在我的情况下,这是问题所在,我必须在开发人员 API 控制台上启用 Google Places API 那是救命稻草。 请帮我找到适用于 Android 的 Google Places API。【参考方案4】:清单文件中 com.google.android.geo.api_key 和 com.google.android.maps.v2.API_KEY 不应相同。
转到https://console.developers.google.com/project
登录并按照以下步骤获取地点选择器位置的密钥。
创建或选择现有 > 使用 google apis > Google Places API for Android > 在左侧菜单中启用 > 凭据 > 添加凭据 > api 密钥 > android 密钥 > 创建 > 复制密钥。
将您的密钥粘贴到清单“com.google.android.geo.api_key”
注意:每天 1000 次 Google Places api 请求的限制。在你必须付钱之后。最好避免使用 PlacePicker。
【讨论】:
我认为 Google 目前对所有 API 都使用一个 API 密钥。【参考方案5】:就我而言,API 存在冲突。我添加了 google-service.json 文件,该文件也具有 API 密钥,并为地图生成了新密钥。所以地点选择器立即关闭。 解决方案:
使用 google-service.json 文件中的单个 API 密钥
为您的 Google Cloud Platform 项目启用“Places SDK for Android”功能(与 Firebase 项目中的名称相同,请勿使用不同的项目。您会发现与您在 Firebase 中使用的名称相同的项目)
为 Android 应用设置 SHA1 应用程序限制(推荐)检查您是否仅在应用程序标签中放置了以下代码
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="API_KEY" />
【讨论】:
第 4 步应该在您的清单文件中吗?还是不应该在 Manifest 文件中? 是的。它应该是。【参考方案6】:这个问题也让我发疯了,关于这个问题有很多问题,但没有人对我有帮助。最后,我发现有不同的 Google Places API,特别是针对 Android。因此,我使用的 API-Key 仅适用于非 Android 版本。
使用此链接生成您的密钥 https://developers.google.com/places/android-api/signup
【讨论】:
【参考方案7】:您可能忘记将您的机器 SHA 密钥添加到 Google 地图控制台。遇到同样的问题,将我的 SHA 密钥添加到控制台,它开始正常工作。
【讨论】:
【参考方案8】:我在控制台的 APIs & Auth 中填写了Consent screen,并且工作正常。检查屏幕截图。
【讨论】:
【参考方案9】:奇怪的是,这对我来说是一个凭据问题。即使在调试模式下没有警告,它也可以工作,但是当我使用我的应用程序的发布版本时,它就无法工作(我已经注册了我的发布和调试 sha1 密钥)所以我删除了所有限制,现在它可以工作了。
【讨论】:
【参考方案10】:在gradle中添加编译'com.google.android.gms:play-services-location:8.1.0'
【讨论】:
【参考方案11】:我就把它放在这里,也许它对将来的人有帮助。
对我来说,使用错误的 Api 密钥会导致崩溃,尽管它过去运行良好。
我必须使用第二个密钥(由 Google 服务为 Android 自动创建的那个)而不是我创建的第一个。
【讨论】:
【参考方案12】:就我而言,当我将当前 API 密钥更改为 google-service.json
中的那个时,它解决了问题。
在 google-services.json 中:
"api_key": [
"current_key": "PASTE THIS API KEY TO THE MANIFEST"
]
【讨论】:
【参考方案13】:PlacePicker
现已正式弃用。
我正在尝试完成 Udacity 高级 Android 应用程序开发课程,但遇到了同样的问题。 https://developers.google.com/places/android-sdk/client-migration#place-picker-deprecation 这么说
地点选择器已于 2019 年 1 月 29 日弃用。它已关闭 于 2019 年 7 月 29 日,并且不再可用。继续使用会 导致错误消息。新的 SDK 不支持 Place 选择器。
交叉发帖到https://github.com/googlemaps/android-places-demos/issues/2
【讨论】:
【参考方案14】:PlacePicker 现已正式弃用。
试试这个库。重量轻,类似于具有一些附加功能的地点选择器。
https://github.com/BilalSiddiqui/AddressPicker
【讨论】:
【参考方案15】:在我的情况下,我没有向谷歌提供我的结算帐户详细信息,因此即使启用了 api,它也被禁用。
如果你也是这种情况,在谷歌云控制台中添加结算账户,最后你就可以做到了。
【讨论】:
以上是关于Android Place Picker 在启动后立即关闭的主要内容,如果未能解决你的问题,请参考以下文章
更改 Google Place Picker Appbar 文本颜色
React-Native-Image-Picker 对话框在 IOS 中启动后自动关闭
Places for Android API 已弃用替代方案
如何在 Android 中使用 Place Autocomplete Intent Builder 获取 Place 的营业时间?