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_keycom.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 APIDeveloper 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 生成了新密钥。所以地点选择器立即关闭。 解决方案:

  1. 使用 google-service.json 文件中的单个 API 键

  2. 为您的 Google Cloud Platform 项目启用 "Places SDK for Android" 功能(与 Firebase 项目同名,不要使用不同的项目。您会发现同名项目你在 Firebase 中使用)

  3. 为 android 应用设置 SHA1 应用程序限制(推荐)
  4. 检查您是否仅在应用程序标签中放置了以下代码

        <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,但具有一些附加功能。

https://github.com/BilalSiddiqui/AddressPicker

在我的例子中,我没有向 google 提供我的结算帐户详细信息,因此 api 即使在启用后仍被禁用。

如果您也是这种情况,请在google云控制台中添加结算账户,最终您就可以做到了。