Ik ontwikkel een Android-applicatie als onderdeel van een project en gebruik de Google Places API om interessante plaatsen weer te geven op basis van locatie. Ik gebruik de PlacePicker Inentbuilder om dit te bereiken.
Wanneer de app echter wordt uitgevoerd, wordt de plaatskiezer gestart en vervolgens onmiddellijk gesloten (ongeveer 1-2 seconden).
Ik heb de onderstaande suggesties al geïmplementeerd (die ik van andere antwoorden heb gekregen):
Ik heb de openbare API-sleutel voor Android-apps gegenereerd en neem deze op in de metadatatag in het app-manifest.
Ik heb de API “Google Places API voor Android” ingeschakeld op de ontwikkelaarsconsole.
Ik heb de nieuwste versie van de afspeelservices opgenomen in afhankelijkheden in build.gradle.
Ik heb mijn code en de logcat hieronder toegevoegd. Laat het me weten als ik nog iets moet toevoegen.
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 – Dit is de enige 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 – Activiteit die de Google Places API gebruikt:
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
Antwoord 1, autoriteit 100%
De oplossingen van Francois Wouts hebben hieraan bijgedragen. Bedankt François…
Ik heb de logboeken doorzocht met het trefwoord ‘Places’ en ontdekte dat Places API inderdaad een uitzondering maakte. Het verwachtte de com.google.android.geo.API_KEY
binnen de <application>
-tags in de Manifest.xml.
Ik was veranderd naar com.google.android.geo.API_KEY
in de <activity>
-tag en niet die in de <application>
-tag.
Nu gewijzigd in com.google.android.geo.API_KEY
en dezelfde regels verwijderd uit de <activity>
-tag en het werkt. Voel me een idioot dat ik dit niet alleen heb opgelost..
De metadatatag moet
android:name="com.google.android.geo.API_KEY"
bevatten
Het moet binnen de<application>
-tag in het manifest staan.
Antwoord 2, autoriteit 48%
Heb je gecontroleerd of je API-sleutel is gekoppeld aan je applicatie (pakketnaam en SHA-1-vingerafdruk van het certificaat van je app) in de Ontwikkelaarsconsole?
Je kunt instructies vinden op Aanmelden en API-sleutels. Zorg ervoor dat u het instelt voor zowel uw debug- als uw vrijgavecertificaten.
Ik hoop dat dat helpt!
Antwoord 3, autoriteit 29%
Ik had hetzelfde probleem. Zorg ervoor dat u de Google Places API voor Androidinschakelt en niet alleen de Places APIin de Ontwikkelaarsconsole. “Places API for Android” wordt niet weergegeven onder API’s & Auth/API’somdat het (nog) geen populaire API is. U moet ernaar zoeken met behulp van het API-zoekvak.
Antwoord 4, autoriteit 6%
In manifestbestand com.google.android.geo.api_keyen com.google.android.maps.v2.API_KEYmogen niet hetzelfde zijn.
ga naar https://console.developers.google.com/project
log in en volg deze stappen om de sleutel voor placepicker-plaatsen te krijgen.
maak of kies bestaande > gebruik google api’s > Google Places API voor Android> > inschakelen inloggegevens in linkermenu > inloggegevens toevoegen > api-sleutel > Android-toets > maak > kopieersleutel.
plak uw sleutel in manifest “com.google.android.geo.api_key“
Opmerking: er is een limiet van 1000 verzoeken per dag voor google places api. nadat je geld moet betalen. Het is beter om PlacePicker te vermijden.
Antwoord 5, autoriteit 3%
In mijn geval was er een conflict tussen API’s. Ik heb het bestand google-service.json toegevoegd dat ook een API-sleutel had en ik heb een nieuwe sleutel voor Maps gegenereerd. Dus plaatskiezer sloot onmiddellijk.
Oplossing:
-
Gebruik een enkele API-sleutel in het bestand google-service.json
-
Schakel de functie “Places SDK for Android” in voor uw Google Cloud Platform-project (met dezelfde naam als in Firebase-project, gebruik geen ander project. U vindt hetzelfde project met dezelfde naam als in Firebase)
- Zet SHA1-toepassingsbeperking voor Android-app (aanbevolen)
-
Controleer of u de volgende code alleen in de toepassingstag hebt geplaatst
<meta-data android:name="com.google.android.geo.API_KEY" android:value="API_KEY" />
Antwoord 6, autoriteit 2%
Dit probleem maakte me ook gek, er zijn zoveel problemen met betrekking tot precies dit probleem, maar niemand was behulpzaam voor mij. Uiteindelijk kwam ik erachter dat er verschillende Google Places API’s zijn speciaal voor Android. Bijgevolg was de API-sleutel die ik gebruikte gewoon voor de niet-Android-versie.
Genereer uw sleutel via deze link
https://developers.google.com/places/android-api/signup
Antwoord 7, autoriteit 2%
Misschien bent u vergeten de SHA-sleutel van uw machine toe te voegen aan de Google Maps Console. Geconfronteerd met hetzelfde probleem, mijn SHA-sleutel toegevoegd aan de console, het begon goed te werken.
Antwoord 8, autoriteit 2%
Ik vul het Toestemmingsschermin API’s & Auth van de console en het werkt prima. Controleer de schermafbeelding.
Antwoord 9, autoriteit 2%
Het was vreemd dat het een probleem met inloggegevens was voor mij. Het werkt zelfs zonder waarschuwing in de foutopsporingsmodus, maar wanneer ik de vrijgegeven versie van mijn app gebruik, werkt het gewoon niet (ik heb mijn vrijgave en debug sha1-sleutels geregistreerd) Dus ik heb alle beperkingen verwijderd en nu werkt het.
Antwoord 10, autoriteit 2%
Compilatie 'com.google.android.gms:play-services-location:8.1.0'
in stappen toevoegen
Antwoord 11
Ik zal dit hier neerzetten, misschien helpt het iemand in de toekomst.
Voor mij veroorzaakte het gebruik van de verkeerde API-sleutel de crash, ook al werkte het in het verleden prima.
Ik moest de tweede sleutel gebruiken (degene die automatisch is gemaakt door Google-services voor Android) in plaats van de eerste die ik heb gemaakt.
Antwoord 12
In mijn geval, toen ik de huidige API-sleutel veranderde met die in google-service.json
, loste dit het probleem op.
In google-services.json:
"api_key": [
{
"current_key": "PASTE THIS API KEY TO THE MANIFEST"
}
]
Antwoord 13
De PlacePicker
is nu officieel verouderd.
Ik probeer de cursus Udacity Advanced Android App Development af te ronden en loop tegen hetzelfde probleem aan.
https://developers.google.com/places/ android-sdk/client-migration#place-picker-deprecationzegt dat
De plaatskiezer is beëindigd op 29 januari 2019. Hij is uitgeschakeld
op 29 juli 2019, en is niet langer beschikbaar. Voortgezet gebruik zal
resulteren in een foutmelding. De nieuwe SDK ondersteunt de plaats niet
Kiezer.
Cross-posten naar https://github.com/googlemaps/android -places-demos/issues/2
Antwoord 14
De PlacePicker is nu officieel verouderd.
Probeer deze bibliotheek. Licht van gewicht en vergelijkbaar met placepicker met enkele extra functies.
https://github.com/BilalSiddiqui/AddressPicker
Antwoord 15
In mijn geval had ik Google mijn factureringsaccountgegevens niet verstrekt, dus de API was uitgeschakeld, zelfs nadat ik deze had ingeschakeld.
Als dit ook voor jou het geval is, voeg dan het factureringsaccount toe in de Google Cloud Console en uiteindelijk kun je het doen.