web-dev-qa-db-ja.com

Androidプレイスピッカーは起動直後に閉じます

プロジェクトの一部としてAndroidアプリケーションを開発しています。GooglePlaces APIを使用して場所に基づいて関心のある場所を表示しています。これを行うためにPlacePicker Inentbuilderを使用しています。

ただし、アプリを実行すると、プレイスピッカーが起動してすぐに閉じます(約1〜2秒)。

私はすでに以下の提案を実装しています(他の回答から得たもの):

Androidアプリケーションの公開APIキーを生成しました。これをアプリマニフェストのメタデータタグに含めています。

開発者コンソールで「Android向けGoogleプレイスAPI」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-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
52

Francois Woutsのソリューションはこれに答えるのに役立ちました。フランソワありがとうございます...

キーワード「Places」でログを検索したところ、Places APIが実際に例外をスローしていることがわかりました。 Manifest.xmlの_com.google.Android.geo.API_KEY_タグ内に_<application>_が必要です。

_com.google.Android.geo.API_KEY_タグではなく_<activity>_タグで_<application>_に変更しました。

これで_com.google.Android.geo.API_KEY_に変更され、_<activity>_タグから同じ行が削除され、機能するようになりました。自分でこれを解決していないのはばかみたいです。

メタデータタグは_Android:name="com.google.Android.geo.API_KEY"_を読み取る必要があります
マニフェストの_<application>_タグ内にある必要があります。

65

enter image description here APIキーがアプリケーション(パッケージ名とアプリの証明書のSHA-1フィンガープリント)に関連付けられていることを Developer Console

手順は Signup and API Keys にあります。デバッグ証明書とリリース証明書の両方に対して必ず設定してください。

それがお役に立てば幸いです!

29
Francois Wouts

私は同じ問題を抱えていました。 Developer ConsolePlaces APIだけでなく、Google Places API for Androidを必ず有効にしてください。 「Android用のPlaces API」は、(まだ)人気のあるAPIではないため、APIとAuth/APIの下には表示されません。 API検索ボックスを使用して検索する必要があります。

19
Anirban

マニフェストファイルcom.google.Android.geo.api_keyおよびcom.google.Android.maps.v2。 API_KEYは同じであってはなりません。

https://console.developers.google.com/project に移動します

ログインし、次の手順に従ってプレースピッカーの場所のキーを取得します。

既存の作成または選択> google apiを使用>Android用Google Places API>有効化>左メニューの資格情報>資格情報の追加> apiキー> Android key> create> copy key。

マニフェスト「com.google.Android.geo.api_key」にキーを貼り付けます

:Google Places APIには1日あたり1000件のリクエストの制限があります。お金を払わなければならない後。 PlacePickerを避ける方が良い。

私の場合、APIの競合がありました。 APIキーも持っているgoogle-service.jsonファイルを追加し、マップの新しいキーを生成しました。そのため、場所の選択はすぐに終了していました。解決 :

  1. Google-service.jsonファイルにある単一のAPIキーを使用します

  2. Google Cloud Platformプロジェクトの「Android用Places SDK」機能を有効にします(Firebaseプロジェクトと同じ名前で、別のプロジェクトを使用しないでください。Firebaseで使用しているプロジェクトと同じ名前のプロジェクトがあります)

  3. Android app(推奨)のSHA1アプリケーション制限を設定する
  4. アプリケーションタグのみに次のコードを配置したかどうかを確認します

        <meta-data
            Android:name="com.google.Android.geo.API_KEY"
            Android:value="API_KEY" />
    
2
snj

この問題も私を夢中にさせました。まさにこの問題に関しては非常に多くの問題がありますが、誰も私を助けてくれませんでした。最後に、特にAndroid用のさまざまなGoogle Places APIがあることを理解しました。そのため、私が使用していたAPIキーは、Android以外のバージョン用でした。

このリンクを使用してキーを生成します https://developers.google.com/places/Android-api/signup

1
bsautermeister

コンソールのAPIとAuthで同意画面に記入し、正常に機能しています。スクリーンショットを確認してください。 enter image description here

1

それが私にとってクレデンシャルの問題であることは奇妙でした。デバッグモードで警告がなくても機能しますが、アプリのリリースバージョンを使用する場合は機能しません(リリースを登録してsha1キーをデバッグしているため)すべての制限を削除し、機能するようになりました

1
Yusuf Çağlar

マシンを追加するのを忘れた可能性がありますSHAキーをGoogleマップコンソールに追加しました。同じ問題に直面して、追加したSHA 。

1
Satya Attili

コンパイルを追加'com.google.Android.gms:play-services-location:8.1.0' gradleで

1

これをここにドロップします。将来的に誰かを助けるかもしれません。

私にとって、間違ったApiキーを使用すると、以前は正常に動作していましたが、クラッシュを引き起こしました。

Places SDK for Android - Credentials

私が作成した最初のキーの代わりに、2番目のキー(Android向けGoogleサービスによって自動作成されるキー)を使用する必要がありました。

0
Ahmed Mourad

私の場合、現在のAPIキーをgoogle-service.json、それは問題を解決しました。

Google-services.jsonで:

 "api_key": [
        {
          "current_key": "PASTE THIS API KEY TO THE MANIFEST"
        }
      ]
0
Suraj Vaishnav