web-dev-qa-db-fra.com

Android Place Picker se ferme immédiatement après le lancement

Je développe une application Android dans le cadre d'un projet et j'utilise l'API Google Places pour afficher les lieux d'intérêt en fonction de l'emplacement. J'utilise PlacePicker Inentbuilder pour accomplir cela.

Cependant, lorsque l'application est lancée, le sélecteur de lieu démarre puis se ferme immédiatement (environ 1 à 2 secondes). 

J'ai déjà mis en œuvre les suggestions ci-dessous (que j'ai obtenues d'autres réponses):

J'ai généré la clé publique API pour les applications Android et je l'inclue dans la balise meta-data du manifeste de l'application. 

J'ai activé l'API "Google Places API pour Android" sur la console des développeurs.

J'ai inclus la dernière version des services de jeu dans les dépendances de build.gradle.

J'ai inclus mon code et le logcat ci-dessous. Faites-moi savoir si j'ai besoin d'inclure autre chose.

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 (module d'application - il s'agit du seul module)

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 - Activité utilisant l'API Google Places:

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
47

Les solutions de François Wouts ont aidé à répondre à cette question. Merci François ...

J'ai effectué une recherche dans les journaux avec le mot clé "Places" et j'ai constaté que cette API levait effectivement une exception. Il s’attendait à ce que com.google.Android.geo.API_KEY figure entre les balises <application> du fichier Manifest.xml. 

J'avais changé pour com.google.Android.geo.API_KEY dans la balise <activity> et non celle dans la balise <application>

Maintenant changé en com.google.Android.geo.API_KEY et a supprimé les mêmes lignes de la balise <activity> et l'a fait fonctionner. Sentez-vous comme un idiot pour ne pas travailler par moi-même ..

La balise meta-data devrait indiquer Android:name="com.google.Android.geo.API_KEY"
Il devrait être dans la balise <application> dans le manifeste.

60

 enter image description here Avez-vous vérifié à deux reprises que votre clé API est associée à votre application (nom du package et empreinte SHA-1 du certificat de votre application) dans Developer Console ?

Vous pouvez trouver des instructions sur Clés d'inscription et API . Assurez-vous de le configurer pour vos certificats de débogage et de version.

J'espère que ça aide!

28
Francois Wouts

J'avais le même problème. Assurez-vous d’activer Google Places API pour Android et pas seulement Places API dans Developer Console . "Places API pour Android" n'apparaîtra pas sous APIs & Auth/APIs car ce n'est pas encore une API populaire. Vous devrez le rechercher à l'aide du champ de recherche de l'API.

18
Anirban

Dans le fichier manifeste, com.google.Android.geo.api_key et com.google.Android.maps.v2.API_KEY ne doivent pas être identiques.

accédez à https://console.developers.google.com/project

connectez-vous et suivez ces étapes pour obtenir les clés pour les lieux Placepicker.

créer ou choisir des sites existants> utiliser Google Apis> l'API Google Adresses pour Android> activer> informations d'identification dans le menu de gauche> ajouter des informations d'identification> clé api> clé Android> créer> clé de copie.

collez votre clé au manifeste "com.google.Android.geo.api_key"

Note: il y a une limite de 1000 demandes par jour pour Google Places Api. après avoir à payer de l'argent. Mieux vaut éviter PlacePicker.

Je remplis l’écran Consent dans les API et l’authentification de la console et son bon fonctionnement. Vérifiez la capture d'écran .  enter image description here

1
varotariya vajsi

Dans mon cas, il y avait un conflit d'API. J'ai ajouté le fichier google-service.json qui contenait également une clé API et j'ai généré une nouvelle clé pour Maps. Alors le sélecteur de place se fermait immédiatement . Solution: 

  1. Utiliser une clé API unique dans le fichier google-service.json

  2. Activez la fonctionnalité "Places SDK pour Android" pour votre projet Google Cloud Platform (avec le même nom que dans le projet Firebase, n'utilisez pas de projet différent. Vous retrouverez le même nom de projet que vous utilisez dans Firebase).

  3. Put SHA1 Application Restriction pour application Android (recommandé)
  4. Vérifiez si vous avez placé le code suivant uniquement dans la balise Application

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

C'était étrange que ce soit un problème d'accréditation pour moi. Il fonctionne même sans avertissement en mode débogage, mais lorsque j'utilise la version publiée de mon application, il ne fonctionne tout simplement pas (j'ai enregistré ma version et les clés de débogage sha1).

1
Yusuf Çağlar

Vous avez peut-être oublié d'ajouter la clé SHA de votre ordinateur à la console Google Maps. Face au même problème, ajout de ma clé SHA à la console, cela a bien fonctionné.

1
Satya Attili

Ajouter la compilation 'com.google.Android.gms:play-services-location:8.1.0' en grade

1
Mahendra Tejaswi

Ce problème m'a rendu fou aussi, il y a tellement de problèmes concernant exactement ce problème, mais personne ne m'a été utile. À la fin, j'ai découvert qu'il existe différentes API Google Adresses, en particulier pour Android. Par conséquent, la clé API que j'utilisais était simplement destinée à la version non Android.

Générez votre clé en utilisant ce lien https://developers.google.com/places/Android-api/signup

0
bsautermeister

Je vais laisser tomber ça ici, peut-être que ça aidera quelqu'un dans le futur.

Pour moi, l'utilisation de la mauvaise clé Api a provoqué le crash, même si cela a bien fonctionné dans le passé.

 Places SDK for Android - Credentials

J'ai dû utiliser la deuxième clé (celle créée automatiquement par Google Services pour Android) au lieu de la première que j'ai créée.

0
Ahmed Mourad