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
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.
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!
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.
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.
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:
Utiliser une clé API unique dans le fichier google-service.json
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).
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" />
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).
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é.
Ajouter la compilation 'com.google.Android.gms:play-services-location:8.1.0'
en grade
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
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é.
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.