webentwicklung-frage-antwort-db.com.de

Der Android Place Picker wird unmittelbar nach dem Start geschlossen

Ich entwickle eine Android-Anwendung als Teil eines Projekts und verwende die Google Places-API, um Orte von Interesse basierend auf dem Standort anzuzeigen. Ich verwende den PlacePicker Inentbuilder, um dies zu erreichen.

Wenn die App ausgeführt wird, wird die Ortsauswahl gestartet und sofort geschlossen (ca. 1-2 Sekunden). 

Ich habe die folgenden Vorschläge bereits umgesetzt (die ich aus anderen Antworten erhielt):

Ich habe den öffentlichen API-Schlüssel für Android-Anwendungen generiert und füge diesen in das Metadaten-Tag im App-Manifest ein. 

Ich habe die API "Google Places-API für Android" in der Entwicklerkonsole aktiviert.

Ich habe die neueste Version von Play Services in build.gradle in die Abhängigkeiten aufgenommen.

Ich habe meinen Code und das Logcat unten angegeben. Lass es mich wissen, wenn ich noch etwas hinzufügen muss.

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-Modul - Dies ist das einzige Modul)

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 - Aktivität, die Google Places-API verwendet:

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: [email protected] time:628772943
05-05 23:38:30.598  21408-21408/com.sampath.project.project_v2 I/Timeline﹕ Timeline: Activity_idle id: [email protected] 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: [email protected] 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: [email protected] time:628776586
47

Die Lösungen von Francois Wouts halfen, dies zu beantworten. Vielen Dank, Francois ...

Ich habe die Protokolle mit dem Stichwort "Places" durchsucht und festgestellt, dass die Places-API tatsächlich eine Ausnahme auslöst. Es erwartete den com.google.Android.geo.API_KEY innerhalb der <application>-Tags in der Manifest.xml. 

Ich hatte com.google.Android.geo.API_KEY im <activity>-Tag geändert und nicht den im <application>-Tag. 

Nun zu com.google.Android.geo.API_KEY geändert und die gleichen Zeilen aus dem <activity>-Tag entfernt und in Betrieb genommen. Fühle mich wie ein Idiot, weil ich das nicht selbst erledigt habe.

Das Metadaten-Tag sollte Android:name="com.google.Android.geo.API_KEY" lesen.
Es sollte sich innerhalb des <application>-Tags im Manifest befinden.

60

 enter image description here Haben Sie in der Developer Console überprüft, ob Ihr API-Schlüssel mit Ihrer Anwendung (Paketname und SHA-1-Fingerabdruck des App-Zertifikats) verknüpft ist?

Anweisungen finden Sie unter Signup und API Keys . Stellen Sie sicher, dass Sie es sowohl für Ihr Debugging als auch für Ihre Release-Zertifikate einrichten.

Ich hoffe das hilft!

28
Francois Wouts

Ich hatte das gleiche Problem. Stellen Sie sicher, dass Sie Google Places-API für Android und nicht nur Places-API in der Developer Console aktivieren. "Places-API für Android" wird unter APIs & Auth/APIs nicht angezeigt, da es sich (noch) nicht um eine beliebte API handelt. Sie müssen danach mit dem API-Suchfeld danach suchen.

18
Anirban

In der Manifestdatei com.google.Android.geo.api_key und com.google.Android.maps.v2.API_KEY sollte es nicht gleich sein.

gehen Sie zu https://console.developers.google.com/project

melden Sie sich an und befolgen Sie diese Schritte, um den Schlüssel für Placepicker-Orte zu erhalten.

vorhanden erstellen oder auswählen> Google-API verwenden> Google Places-API für Android> Aktivieren> Anmeldeinformationen im linken Menü> Anmeldeinformationen hinzufügen> API-Schlüssel> Android-Schlüssel> Erstellen> Schlüssel kopieren.

fügen Sie Ihren Schlüssel im Manifest "com.google.Android.geo.api_key" ein.

Hinweis: Für Google Places-API gibt es ein Limit von 1000 Anfragen pro Tag. nachdem musst du geld zahlen. Besser PlacePicker vermeiden.

Ich fülle den Consent-Bildschirm in APIs & Auth der Konsole aus und funktioniert einwandfrei. Überprüfen Sie den Screenshot  enter image description here

1

In meinem Fall gab es einen Konflikt mit APIs. Ich habe die Datei google-service.json hinzugefügt, die auch über einen API-Schlüssel verfügt, und ich habe einen neuen Schlüssel für Maps generiert. Der Place Picker wurde also sofort geschlossen Lösung: 

  1. Verwenden Sie einen einzigen API-Schlüssel, der sich in der Datei google-service.json befindet

  2. Aktivieren Sie die Funktion "Places SDK for Android" für Ihr Google Cloud Platform-Projekt (mit demselben Namen wie im Firebase-Projekt, verwenden Sie kein anderes Projekt. Sie finden dasselbe Projekt wie in Firebase).

  3. Setzen Sie die SHA1-Anwendungseinschränkung für Android-App (empfohlen)
  4. Prüfen Sie, ob Sie folgenden Code nur in Application-Tag eingefügt haben

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

Es war seltsam, dass es für mich ein Zeugnisproblem war. Es funktioniert auch ohne Warnung im Debugging-Modus, aber wenn ich die freigegebene Version meiner App verwende, funktioniert es einfach nicht (Ich habe meine Release- und Debug-sha1-Schlüssel registriert). Also habe ich alle Einschränkungen aufgehoben und jetzt funktioniert es.

1
Yusuf Çağlar

Möglicherweise haben Sie vergessen, die Computertaste SHA der Google Maps-Konsole hinzuzufügen. Angesichts des gleichen Problems, fügte meine SHA - Taste der Konsole hinzu, begann es gut zu funktionieren.

1
Satya Attili

Fügen Sie 'com.google.Android.gms:play-services-location:8.1.0' in Gradle hinzu

1

Dieses Thema hat mich auch verrückt gemacht, es gibt so viele Probleme, die genau dieses Problem betreffen, aber niemand war hilfreich für mich. Am Ende habe ich herausgefunden, dass es verschiedene Google Places-APIs speziell für Android gibt. Folglich war der API-Schlüssel, den ich verwendete, einfach für die Nicht-Android-Version.

Generieren Sie Ihren Schlüssel mit diesem Link https://developers.google.com/places/Android-api/signup

0
bsautermeister

Ich lass das hier einfach fallen, vielleicht hilft es in der Zukunft jemandem.

Die falsche Api-Taste hat für mich den Absturz verursacht, auch wenn es in der Vergangenheit gut funktioniert hat.

 Places SDK for Android - Credentials

Ich musste den zweiten Schlüssel (den von Google-Diensten für Android automatisch erstellten) anstelle des ersten Schlüssels verwenden, den ich erstellt habe.

0
Ahmed Mourad

In meinem Fall, als ich den aktuellen API-Schlüssel durch den in google-service.json, das Problem wurde behoben.

In google-services.json:

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