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 中的 &lt;application&gt; 标记中包含 com.google.android.geo.API_KEY

我在&lt;activity&gt; 标记中更改为com.google.android.geo.API_KEY,而不是&lt;application&gt; 标记中的那个。

现在更改为 com.google.android.geo.API_KEY 并从 &lt;activity&gt; 标记中删除相同的行,并使其正常工作。没有自己解决这个问题,感觉自己像个白痴..

元数据标签应为android:name="com.google.android.geo.API_KEY" 它应该在 Manifest 中的 &lt;application&gt; 标记内。

【讨论】:

我在 下有它,但仍然无法正常工作。 当我们从 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_keycom.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 的营业时间?

在flutter multi_image_picker 4.7.14中访问相机后,iOS 14绿点通知灯始终可见

当我尝试调用 Google Place Markers 时,图像选择器无法正常工作