Android Place Picker 在启动后立即关闭
Android Place Picker closes immediately after launch
我正在开发一个 android 应用程序作为项目的一部分,并使用 Google 个地方 API 来显示基于位置的名胜古迹。我正在使用 PlacePicker Inentbuilder 来完成这个。
但是,当应用程序为 运行 时,地点选择器会启动然后立即关闭(大约 1-2 秒)。
我已经实施了以下建议(我从其他答案中得到的):
我已经为 android 应用程序生成了 public 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(应用程序模块 - 这是唯一的模块)
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 - Activity 使用 google 个地方 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
Have you double checked that your API key is associated with your application (package name and SHA-1 fingerprint of your app's certificate) in the Developer Console?
您可以在 Signup and API Keys 找到说明。确保为您的调试和发布证书设置它。
希望对您有所帮助!
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>
标记中删除了相同的行,并使其正常工作。不自己解决这个问题感觉自己像个白痴..
The meta-data tag should read android:name="com.google.android.geo.API_KEY"
It should be within the <application>
tag in the Manifest.
在清单文件中 com.google.android.geo.api_key 和 com.google.android.maps。v2.API_KEY 不应该相同。
转到https://console.developers.google.com/project
登录并按照以下步骤获取 placepicker 位置的密钥。
创建或选择现有的 > 使用 google apis > Google Places API for Android > 启用 > 左侧菜单中的凭据 > 添加凭据 > api 密钥 > android 密钥 > 创建 > 复制密钥。
将您的密钥粘贴到清单“com.google.android.geo.api_key”
注意:google 个地方 api 每天有 1000 个请求的限制。在你必须付钱之后。最好避免使用 PlacePicker。
在gradle
中添加编译'com.google.android.gms:play-services-location:8.1.0'
我遇到了同样的问题。确保为 Android 启用 Google Places API 而不仅仅是 Places API在 Developer Console。 "Places API for Android" 不会出现在 APIs & Auth/APIs 下,因为它还不是流行的 API(还)。您必须使用 API 搜索框进行搜索。
这个问题也让我很抓狂,关于这个问题的问题有很多,但没有人对我有帮助。最后,我发现有不同的 Google 地方 API,尤其是 Android。因此,我使用的 API-Key 仅适用于非 Android 版本。
使用此 link 生成您的密钥
https://developers.google.com/places/android-api/signup
可能是您忘记将计算机 SHA 密钥添加到 Google 地图控制台。遇到同样的问题,将我的 SHA 密钥添加到控制台,它开始正常工作。
我在控制台的 API 和 Auth 中填写了同意屏幕,它工作正常。检查屏幕截图。
奇怪的是,这对我来说是一个凭据问题。它在调试模式下甚至没有警告也能工作,但是当我使用我的应用程序的发布版本时它就不起作用 (我已经注册了我的发布和调试 sha1 密钥)所以我删除了所有限制,现在它工作了。
在我的例子中存在 API 的冲突。我添加了 google-service.json 文件,该文件也有 API 密钥,并且我为 Maps 生成了新密钥。所以地点选择器立即关闭。
解决方案:
使用 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" />
我就把它放在这里,也许它对以后的人有帮助。
对我来说,使用错误的 Api 键导致了崩溃,尽管它在过去工作得很好。
我必须使用第二个密钥(由 Google 服务为 Android 自动创建的密钥)而不是我创建的第一个密钥。
在我的例子中,当我将当前 API 密钥更改为 google-service.json
中的密钥时,它解决了问题。
在google-services.json:
"api_key": [
{
"current_key": "PASTE THIS API KEY TO THE MANIFEST"
}
]
PlacePicker
现已正式弃用。
我正在尝试完成 Udacity 高级 Android 应用程序开发课程和 运行 同一期。
https://developers.google.com/places/android-sdk/client-migration#place-picker-deprecation 说
The Place Picker was deprecated on January 29, 2019. It was turned off
on July 29, 2019, and is no longer available. Continued use will
result in an error message. The new SDK does not support the Place
Picker.
交叉发布到 https://github.com/googlemaps/android-places-demos/issues/2
PlacePicker 现已正式弃用。
试试这个库。重量轻,类似于 placepicker,但具有一些附加功能。
在我的例子中,我没有向 google 提供我的结算帐户详细信息,因此 api 即使在启用后仍被禁用。
如果您也是这种情况,请在google云控制台中添加结算账户,最终您就可以做到了。
我正在开发一个 android 应用程序作为项目的一部分,并使用 Google 个地方 API 来显示基于位置的名胜古迹。我正在使用 PlacePicker Inentbuilder 来完成这个。
但是,当应用程序为 运行 时,地点选择器会启动然后立即关闭(大约 1-2 秒)。
我已经实施了以下建议(我从其他答案中得到的):
我已经为 android 应用程序生成了 public 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(应用程序模块 - 这是唯一的模块)
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 - Activity 使用 google 个地方 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
您可以在 Signup and API Keys 找到说明。确保为您的调试和发布证书设置它。
希望对您有所帮助!
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>
标记中删除了相同的行,并使其正常工作。不自己解决这个问题感觉自己像个白痴..
The meta-data tag should read
android:name="com.google.android.geo.API_KEY"
It should be within the<application>
tag in the Manifest.
在清单文件中 com.google.android.geo.api_key 和 com.google.android.maps。v2.API_KEY 不应该相同。
转到https://console.developers.google.com/project
登录并按照以下步骤获取 placepicker 位置的密钥。
创建或选择现有的 > 使用 google apis > Google Places API for Android > 启用 > 左侧菜单中的凭据 > 添加凭据 > api 密钥 > android 密钥 > 创建 > 复制密钥。
将您的密钥粘贴到清单“com.google.android.geo.api_key”
注意:google 个地方 api 每天有 1000 个请求的限制。在你必须付钱之后。最好避免使用 PlacePicker。
在gradle
中添加编译'com.google.android.gms:play-services-location:8.1.0'
我遇到了同样的问题。确保为 Android 启用 Google Places API 而不仅仅是 Places API在 Developer Console。 "Places API for Android" 不会出现在 APIs & Auth/APIs 下,因为它还不是流行的 API(还)。您必须使用 API 搜索框进行搜索。
这个问题也让我很抓狂,关于这个问题的问题有很多,但没有人对我有帮助。最后,我发现有不同的 Google 地方 API,尤其是 Android。因此,我使用的 API-Key 仅适用于非 Android 版本。
使用此 link 生成您的密钥 https://developers.google.com/places/android-api/signup
可能是您忘记将计算机 SHA 密钥添加到 Google 地图控制台。遇到同样的问题,将我的 SHA 密钥添加到控制台,它开始正常工作。
我在控制台的 API 和 Auth 中填写了同意屏幕,它工作正常。检查屏幕截图。
奇怪的是,这对我来说是一个凭据问题。它在调试模式下甚至没有警告也能工作,但是当我使用我的应用程序的发布版本时它就不起作用 (我已经注册了我的发布和调试 sha1 密钥)所以我删除了所有限制,现在它工作了。
在我的例子中存在 API 的冲突。我添加了 google-service.json 文件,该文件也有 API 密钥,并且我为 Maps 生成了新密钥。所以地点选择器立即关闭。 解决方案:
使用 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" />
我就把它放在这里,也许它对以后的人有帮助。
对我来说,使用错误的 Api 键导致了崩溃,尽管它在过去工作得很好。
我必须使用第二个密钥(由 Google 服务为 Android 自动创建的密钥)而不是我创建的第一个密钥。
在我的例子中,当我将当前 API 密钥更改为 google-service.json
中的密钥时,它解决了问题。
在google-services.json:
"api_key": [
{
"current_key": "PASTE THIS API KEY TO THE MANIFEST"
}
]
PlacePicker
现已正式弃用。
我正在尝试完成 Udacity 高级 Android 应用程序开发课程和 运行 同一期。 https://developers.google.com/places/android-sdk/client-migration#place-picker-deprecation 说
The Place Picker was deprecated on January 29, 2019. It was turned off on July 29, 2019, and is no longer available. Continued use will result in an error message. The new SDK does not support the Place Picker.
交叉发布到 https://github.com/googlemaps/android-places-demos/issues/2
PlacePicker 现已正式弃用。
试试这个库。重量轻,类似于 placepicker,但具有一些附加功能。
在我的例子中,我没有向 google 提供我的结算帐户详细信息,因此 api 即使在启用后仍被禁用。
如果您也是这种情况,请在google云控制台中添加结算账户,最终您就可以做到了。