Reputation: 1181
I am developing an android application as part of a project, and am using Google places API to display places of interest based on location. I am using the PlacePicker Inentbuilder to accomplish this.
However, when the app is run, the place picker launches and then closes immediately (about 1-2 seconds).
I have already implemented the below suggestions (that I got from other answers):
I have generated the public API key for android applications, and am including this in the meta-data tag in the app manifest.
I have enabled the "Google Places API for android" API on the developers console.
I have included the latest play services version in dependencies in build.gradle.
I have included my code and the logcat below. Do let me know if I need to include anything else.
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 module - This is the only 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 - Activity that is using 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
Upvotes: 53
Views: 42579
Reputation: 3765
In my case I had not provided google with my billing account details so the api was was disabled even after enabling it.
If this is also the case for you, add the billing account in the google cloud console and finally you will be able to do it.
Upvotes: 0
Reputation: 2383
The PlacePicker is now officially deprecated.
Try this library. Light weight and similar to placepicker with some additional features.
https://github.com/BilalSiddiqui/AddressPicker
Upvotes: 0
Reputation: 856
The PlacePicker
is now officially deprecated.
I'm trying to complete the Udacity Advanced Android App Development course and running into the same issue. https://developers.google.com/places/android-sdk/client-migration#place-picker-deprecation says that
The Place Picker was deprecated on January 29, 2019. It was turned off on July 29, 2019, and is no longer available. Continued use will result in an error message. The new SDK does not support the Place Picker.
Cross-posting to https://github.com/googlemaps/android-places-demos/issues/2
Upvotes: 0
Reputation: 8305
In my case when I changed current API key with the one which is in google-service.json
, it resolved the problem.
In google-services.json:
"api_key": [
{
"current_key": "PASTE THIS API KEY TO THE MANIFEST"
}
]
Upvotes: 0
Reputation: 303
I'll just drop this here, maybe it helps someone in the future.
For me, using the wrong Api key caused the crash, even though it worked fine in the past.
I had to use the second key (the one that is auto-created by Google services for Android) instead of the first one which i created.
Upvotes: 0
Reputation: 4035
In my case there was conflict of APIs. I have added google-service.json file which also had API key and I generated new key for Maps. So place picker was closing immediately. Solution :
Use single API key which is in google-service.json file
Enable "Places SDK for Android" feature for your Google Cloud Platform project (with same name as in Firebase project , don't use different project. You will find same name project as you are using in Firebase)
Check if you have placed following code in Application tag only
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="API_KEY" />
Upvotes: 2
Reputation: 129
Add compile 'com.google.android.gms:play-services-location:8.1.0'
in gradle
Upvotes: 1
Reputation: 321
It was strange that it was a credentials problem for me. It works even without a warning in debugging mode but when i use released version of my app it just doesnt work (i have registered my release and debug sha1 keys) So i removed all restrictions and now its working.
Upvotes: 1
Reputation: 4041
I filling out the Consent screen in APIs & Auth of the console and its working fine. Check the screen shot.
Upvotes: 1
Reputation: 718
May be you forgot to add your machine SHA key to the Google Maps Console. Faced same issue, Added my SHA Key to the console, it started working fine.
Upvotes: 1
Reputation: 4632
I was having the same issue. Make sure you enable Google Places API for Android and not just Places API in the Developer Console. "Places API for Android" will not show up under APIs & Auth/APIs because it isn’t a popular API (yet). You will have to search for it using the API search box.
Upvotes: 19
Reputation: 3962
Have you double checked that your API key is associated with your application (package name and SHA-1 fingerprint of your app's certificate) in the Developer Console?
You can find instructions at Signup and API Keys. Make sure to set it up for both your debug and your release certificates.
I hope that helps!
Upvotes: 31
Reputation: 1131
This issue made me crazy as well, there are so many issues regarding exactly this problem, but no one was helpful for me. At the end, I figured out that there are different Google Places APIs especially for Android. Consequently, the API-Key that I was using was simply for the non-Android version.
Generate your key using this link https://developers.google.com/places/android-api/signup
Upvotes: 1
Reputation: 1181
Francois Wouts' solutions helped answer this. Thank you Francois...
I searched the logs with keyword 'Places' and found that Places API was indeed throwing an exception. It expected the com.google.android.geo.API_KEY
within the <application>
tags in the Manifest.xml.
I had changed to com.google.android.geo.API_KEY
in the <activity>
tag and not the one in the <application>
tag.
Now changed to com.google.android.geo.API_KEY
and removed the same lines from <activity>
tag, and got it working. Feel like an idiot for not working this out by myself..
The meta-data tag should read
android:name="com.google.android.geo.API_KEY"
It should be within the<application>
tag in the Manifest.
Upvotes: 65
Reputation: 457
In manifest file com.google.android.geo.api_key and com.google.android.maps.v2.API_KEY shouldnot be same.
go to https://console.developers.google.com/project
login and follow these steps to get key for placepicker places.
create or choose existing > use google apis > Google Places API for Android > enable > credentials in left menu > add credentials > api key > android key > create > copy key.
paste your key at manifest "com.google.android.geo.api_key"
Note : there is a limit of 1000 requests per day for google places api. after you have to pay money. Better to avoid PlacePicker.
Upvotes: 4