Android Developer's Guide zur Google Location Services API

Veröffentlicht: 2022-03-11

Die Kenntnis des Standorts Ihres Benutzers ist eine nützliche Information in vielen Anwendungen, die wir heute entwickeln und verwenden. Es gibt viele beliebte standortbasierte Anwendungen, die unser Leben einfacher machen und die Art und Weise ändern, wie wir diese Dienste nutzen. Ein Beispiel ist die äußerst beliebte Anwendung Foursquare, bei der Benutzer, die regelmäßig in eine Einrichtung gehen und dort „einchecken“, oft Rabatte gewinnen. Uber, das Ihnen hilft, eine Fahrt von Ihrem Mobiltelefon zu einem niedrigeren Preis als mit einem normalen Taxi zu bekommen. Die Liste ist groß und wächst weiter.

Ortungsdienst-API

In diesem Artikel werden wir eine einfache Android-Anwendung erstellen, um den Breiten- und Längengrad des Benutzers mithilfe der Google Location Services API von Android zu bestimmen. Bei der Entwicklung von Android-Anwendungen gibt es mehrere Möglichkeiten, den Standort des Benutzers abzurufen.

Paket „android.location“

Das Paket „android.location“ ist seit der Einführung von Android verfügbar und ermöglicht uns den Zugriff auf Ortungsdienste. Diese Dienste ermöglichen es Anwendungen, regelmäßige Aktualisierungen des geografischen Standorts des Geräts zu erhalten.

Das Paket bietet zwei Möglichkeiten, Standortdaten zu erfassen:

  • LocationManager.GPS_PROVIDER: Ermittelt den Standort über Satelliten. Abhängig von den Bedingungen kann es eine Weile dauern, bis dieser Anbieter eine Standortfixierung zurückgibt.

  • LocationManager.NETWORK_PROVIDER: Bestimmt den Standort basierend auf der Verfügbarkeit nahe gelegener Mobilfunkmasten und WLAN-Zugangspunkte. Dies ist schneller als GPS_PROVIDER.

Wenn Sie nach Benutzerstandorten suchen, müssen Sie mit diesen Anbietern und ihrer Verfügbarkeit spielen. Idealerweise erhalten Sie den ersten Standort mithilfe von NETWORK_PROVIDER, was möglicherweise nicht so genau, aber viel schneller ist. Sie können dann versuchen, die Genauigkeit zu erhöhen, indem Sie mithilfe von GPS_PROVIDER nach einer besseren Standortbestimmung suchen.

Die von diesem Paket bereitgestellten APIs sind ziemlich niedrig und verlangen vom Entwickler der Anwendung, die feineren Details zu bestimmen, wann Standortdaten angefordert und Aufrufe an die API auf optimierte Weise geplant werden sollen. Um das Entwicklererlebnis mit standortbasierten Systemdiensten zu verbessern und den Prozess der Entwicklung standortbezogener Anwendungen zu vereinfachen, hat Google eine neue Möglichkeit eingeführt, den Standort eines Benutzers mithilfe von Google Play Services anzufordern. Es bietet eine einfachere API mit höherer Genauigkeit, Geofencing mit geringem Stromverbrauch und vieles mehr.

Google Location Services-API

Die Google Location Services API, auch bekannt als FusedLocationProviderApi, ist die von Google empfohlene Methode, um den Standort eines Benutzers abzurufen. Es bietet die beste Genauigkeit basierend auf unseren Anforderungen. Einige der Vorteile der Verwendung dieser API gegenüber der vorherigen sind:

  • Einfachheit: Im Gegensatz zur vorherigen API müssen Sie sich nicht mehr mit mehreren Anbietern auseinandersetzen. Stattdessen spezifizieren Sie High-Level-Anforderungen wie „hohe Genauigkeit“ oder „geringer Stromverbrauch“ und es wird ein geeigneter Ansatz verfolgt.

  • Verfügbarkeit: Gibt Ihrer App sofortigen Zugriff auf den besten, neuesten bekannten Standort. Normalerweise sind diese Informationen leicht verfügbar, Sie müssen nur danach fragen.

  • Energieeffizienz: Minimiert den Stromverbrauch Ihrer Anwendung.

  • Vielseitigkeit: Erfüllt eine breite Palette von Anforderungen, von Vordergrundanwendungen – die hochgenaue Standortdaten benötigen, bis hin zu Hintergrundanwendungen – die nur regelmäßige Standortaktualisierungen mit vernachlässigbarer Auswirkung auf die Stromversorgung erfordern.

Lassen Sie uns mithilfe dieser API eine standortbasierte Android-Anwendung erstellen. Dazu verwenden wir die von Google vorgeschlagene IDE für die Entwicklung von Android-Anwendungen – Android Studio. Der Einstieg in Android Studio ist ziemlich einfach. Ihre Website beschreibt sehr detailliert das Verfahren zur Installation und Konfiguration von Android Studio, einschließlich des Bootstrap Ihrer ersten Android-Anwendung für die Entwicklung.

Android Studio sollte uns die Sache super einfach machen. Wir müssen jedoch zunächst das Build-Skript konfigurieren und Google Play Services als Abhängigkeit für diese Anwendung hinzufügen. Dies kann durch Ändern der Datei „build.gradle“ wie folgt erfolgen:

 dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' // Add this line }

Zum Zeitpunkt des Schreibens dieses Artikels ist die neueste verfügbare Version von Google Play Services 6.5.87. Stellen Sie sicher, dass Sie immer nach der neuesten verfügbaren Version suchen, bevor Sie beginnen. Falls später neuere Versionen herauskommen und Sie sich entscheiden, sie für Ihre eigenen Projekte zu aktualisieren, testen Sie alle standortbezogenen Funktionen mit allen Versionen von Android, die Sie unterstützen.

An diesem Punkt sollten wir in der Lage sein, mit der eigentlichen Arbeit für unsere Anwendung zu beginnen.

Berechtigung anfordern, AndroidManifest.xml konfigurieren

Androids verfügen über spezielle Sicherheitsfunktionen, die verhindern, dass eine beliebige Anwendung einen genauen Benutzerstandort anfordert. Um dies zu lösen, müssen wir „AndroidManifest.xml“ bearbeiten und die Berechtigung hinzufügen, die wir für diese Anwendung benötigen:

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Wenn wir schon dabei sind, sollten wir auch die Version der Google Play-Dienste definieren, die wir für diese Anwendung verwenden:

 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

Überprüfung der Verfügbarkeit von Google Play-Diensten

Bevor wir auf Funktionen zugreifen, die von Google Play-Diensten bereitgestellt werden, müssen wir überprüfen, ob auf dem Gerät Google Play-Dienste installiert sind und ob die Version die ist, die wir verwenden möchten (6.5.87).

 private boolean checkGooglePlayServices(){ int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(mContext); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * Google Play Services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, mContext, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; }

Diese Methode sucht nach Google Play-Diensten, und falls das Gerät sie nicht installiert hat (es ist selten, aber ich habe solche Fälle gesehen), öffnet sie einen Dialog mit dem entsprechenden Fehler und fordert den Benutzer zur Installation/Aktualisierung auf Google Play-Dienste aus dem Google Play Store.

Google Play-Dienste

Nachdem der Benutzer die von „GooglePlayServicesUtil.getErrorDialog()“ bereitgestellte Auflösung abgeschlossen hat, wird eine Callback-Methode „onActivityResult()“ ausgelöst, sodass wir eine Logik implementieren müssen, um diesen Aufruf zu verarbeiten:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(mContext, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show(); finish(); } } }

Zugriff auf Google-APIs

Um auf Google APIs zuzugreifen, müssen wir nur einen weiteren Schritt ausführen: Erstellen Sie eine Instanz von GoogleApiClient. Der Google API-Client bietet einen gemeinsamen Einstiegspunkt für alle Google Play-Dienste und verwaltet die Netzwerkverbindung zwischen dem Gerät des Benutzers und jedem Google-Dienst. Unser erster Schritt hier ist, die Verbindung zu initiieren. Normalerweise rufe ich diesen Code von der „onCreate“-Methode der Aktivität auf:

 protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); }

Indem wir eine Reihe von Methodenaufrufen verketten, spezifizieren wir die Callback-Schnittstellenimplementierung und die Ortungsdienst-API, die wir verwenden möchten. Die Schnittstellenimplementierung, in diesem Fall „this“, erhält eine Antwort auf die asynchrone „connect()“-Methode, wenn die Verbindung zu den Google Play-Diensten erfolgreich ist, fehlschlägt oder unterbrochen wird. Nach dem Hinzufügen dieses Codes sollte unsere „MainActivity“ so aussehen:

 package com.bitwoo.userlocation; import android.content.Intent; import android.location.Location; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationServices; public class MainActivity extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static int REQUEST_CODE_RECOVER_PLAY_SERVICES = 200; private GoogleApiClient mGoogleApiClient; private Location mLastLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (checkGooglePlayServices()) { buildGoogleApiClient(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, 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); } private boolean checkGooglePlayServices() { int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(this); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * google play services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, this, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(this, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show(); finish(); } } } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } @Override public void onConnected(Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(ConnectionResult connectionResult) { } }

Dann rufen wir in unserer „onStart“-Methode die „connect“-Methode auf und warten, bis die „onConnected“-Callback-Methode aufgerufen wird:

 @Override protected void onStart() { super.onStart(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } }

Die „onConnected“-Methode sieht folgendermaßen aus:

 @Override public void onConnected(Bundle bundle) { mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation != null) { Toast.makeText(this, "Latitude:" + mLastLocation.getLatitude()+", Longitude:"+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } }

Dieser Rückruf wird ausgelöst, wenn Google Play Services verbunden ist, was bedeutet, dass wir bis dahin den letzten bekannten Standort haben sollten. Dieser Ort kann jedoch null sein (was selten, aber nicht unmöglich ist). In diesem Fall empfehle ich, auf Standortaktualisierungen zu hören, die als nächstes behandelt werden.

Auf Standortaktualisierungen lauschen

Nachdem Sie „getLastLocation“ aufgerufen haben, möchten Sie möglicherweise regelmäßige Aktualisierungen vom Fused Location Provider anfordern. Abhängig von Ihrer Anwendung kann dieser Zeitraum kurz oder lang sein. Wenn Sie beispielsweise eine Anwendung entwickeln, die den Standort eines Benutzers verfolgt, während er fährt, müssen Sie in kurzen Abständen auf Aktualisierungen warten. Wenn es in Ihrer Anwendung andererseits darum geht, den Benutzerstandort mit seinem Freund zu teilen, müssen Sie den Standort möglicherweise nur ab und zu anfordern.

Das Erstellen einer Anfrage ist ziemlich einfach – Sie können diese Methode innerhalb der Methode „onCreate“ aufrufen:

 protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(20000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); }

Wir instanziieren ein neues LocationRequest-Objekt. Stellen Sie das Intervall auf 20 Sekunden (20000 Millisekunden) ein. Außerdem haben wir eine gedrosselte Aktualisierungsrate auf 5 Sekunden eingestellt. Dies weist die API an, Aktualisierungen (vorzugsweise) alle 20 Sekunden bereitzustellen, aber wenn innerhalb von 5 Sekunden eine Änderung verfügbar ist, sollte sie diese auch bereitstellen. Schließlich setzen wir die Priorität auf „PRIORITY_HIGH_ACCURACY“, unter den anderen verfügbaren Prioritätsoptionen: PRIORITY_BALANCED_POWER_ACCURACY, PRIORITY_LOW_POWER, PRIORITY_NO_POWER.

Sobald Sie die Anfrage erstellt haben, können Sie mit dem Abhören von Standortaktualisierungen beginnen, nachdem die Methode „onConnected()“ ausgelöst wurde:

 protected void startLocationUpdates() { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); }

Jetzt muss nur noch die Callback-Methode implementiert werden, um die LocationListener-Schnittstelle zu erfüllen:

 public class MainActivity extends ActionBarActivity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { // ... @Override public void onLocationChanged(Location location) { mLastLocation = location; Toast.makeText(this, "Latitude:" + mLastLocation.getLatitude()+", Longitude:"+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } } 

hören Sie auf, auf Updates zu warten

Hören Sie auf, auf Updates zu warten

Es ist wichtig, das Abhören von Updates ausdrücklich zu beenden, wenn Sie sie nicht mehr benötigen oder wenn der Benutzer Ihre Anwendung verlässt. Die folgende Methode sollte innerhalb des Callbacks „onPause“ aufgerufen werden:

 protected void stopLocationUpdates() { if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this); } }

… und Google API trennen:

 @Override protected void onStop() { super.onStop(); if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } }

Einpacken

Wie Sie sehen können, sind die grundlegenden Ideen hinter der Implementierung ortsbezogener Anwendungen in Android sehr einfach. Darüber hinaus sollte es mit den verfügbaren APIs, die sowohl einfach zu verwenden als auch leicht zu verstehen sind, ein Kinderspiel sein, grundlegende standortbasierte Anwendungen für Android zu erstellen. Die kleine Beispielanwendung, die wir hier gebaut haben, soll genau das demonstrieren. Den vollständigen Quellcode dazu finden Sie auf GitHub. Bitte beachten Sie, dass die Anwendung der Einfachheit halber die Callback-Methode „onConnectionFailed“ nicht verarbeitet.

Hoffentlich hilft Ihnen dieses Tutorial beim Einstieg in die Verwendung der Google Location Services API.