Android - Standortbasierte Dienste
Mit Android-Standort-APIs können Sie auf einfache Weise standortbezogene Anwendungen erstellen, ohne sich auf die Details der zugrunde liegenden Standorttechnologie konzentrieren zu müssen.
Dies wird mit Hilfe von möglich Google Play servicesDies erleichtert das Hinzufügen von Standortbewusstsein zu Ihrer App durch automatisierte Standortverfolgung, Geofencing und Aktivitätserkennung.
Dieses Tutorial zeigt Ihnen, wie Sie mithilfe von Standortdiensten in Ihrer App den aktuellen Standort abrufen, regelmäßige Standortaktualisierungen abrufen, Adressen nachschlagen usw.
Das Standortobjekt
Das LocationDas Objekt stellt einen geografischen Ort dar, der aus einem Breiten-, Längen-, Zeitstempel und anderen Informationen wie Peilung, Höhe und Geschwindigkeit bestehen kann. Es gibt folgende wichtige Methoden, die Sie mit dem Standortobjekt verwenden können, um standortspezifische Informationen abzurufen:
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | float distanceTo(Location dest) Gibt die ungefähre Entfernung in Metern zwischen diesem Ort und dem angegebenen Ort zurück. |
2 | float getAccuracy() Ermitteln Sie die geschätzte Genauigkeit dieses Standorts in Metern. |
3 | double getAltitude() Ermitteln Sie die Höhe, falls verfügbar, in Metern über dem Meeresspiegel. |
4 | float getBearing() Holen Sie sich das Lager in Grad. |
5 | double getLatitude() Ermitteln Sie den Breitengrad in Grad. |
6 | double getLongitude() Holen Sie sich den Längengrad in Grad. |
7 | float getSpeed() Holen Sie sich die Geschwindigkeit, falls verfügbar, in Metern / Sekunde über dem Boden. |
8 | boolean hasAccuracy() Richtig, wenn dieser Ort eine Genauigkeit hat. |
9 | boolean hasAltitude() Richtig, wenn dieser Ort eine Höhe hat. |
10 | boolean hasBearing() Richtig, wenn dieser Ort eine Peilung hat. |
11 | boolean hasSpeed() True, wenn dieser Ort eine Geschwindigkeit hat. |
12 | void reset() Löscht den Inhalt des Speicherorts. |
13 | void setAccuracy(float accuracy) Stellen Sie die geschätzte Genauigkeit dieses Standorts in Metern ein. |
14 | void setAltitude(double altitude) Stellen Sie die Höhe in Metern über dem Meeresspiegel ein. |
15 | void setBearing(float bearing) Stellen Sie das Lager in Grad ein. |
16 | void setLatitude(double latitude) Stellen Sie den Breitengrad in Grad ein. |
17 | void setLongitude(double longitude) Stellen Sie den Längengrad in Grad ein. |
18 | void setSpeed(float speed) Stellen Sie die Geschwindigkeit in Metern / Sekunde über dem Boden ein. |
19 | String toString() Gibt eine Zeichenfolge zurück, die eine präzise, für Menschen lesbare Beschreibung dieses Objekts enthält. |
Holen Sie sich den aktuellen Standort
Erstellen Sie einen Standortclient, um den aktuellen Standort abzurufen LocationClient Objekt, verbinden Sie es mit Location Services mit connect() Methode, und rufen Sie dann seine getLastLocation()Methode. Diese Methode gibt den neuesten Speicherort in Form von zurückLocationObjekt, das Längen- und Breitengradkoordinaten und andere Informationen enthält, wie oben erläutert. Um standortbasierte Funktionen in Ihrer Aktivität zu haben, müssen Sie zwei Schnittstellen implementieren:
- GooglePlayServicesClient.ConnectionCallbacks
- GooglePlayServicesClient.OnConnectionFailedListener
Diese Schnittstellen bieten die folgenden wichtigen Rückrufmethoden, die Sie in Ihrer Aktivitätsklasse implementieren müssen:
Sr.Nr. | Rückrufmethoden & Beschreibung |
---|---|
1 | abstract void onConnected(Bundle connectionHint) Diese Rückrufmethode wird aufgerufen, wenn der Standortdienst erfolgreich mit dem Standortclient verbunden ist. Du wirst benutzenconnect() Methode zum Herstellen einer Verbindung zum Standortclient. |
2 | abstract void onDisconnected() Diese Rückrufmethode wird aufgerufen, wenn der Client getrennt wird. Du wirst benutzendisconnect() Methode zum Trennen der Verbindung vom Standortclient. |
3 | abstract void onConnectionFailed(ConnectionResult result) Diese Rückrufmethode wird aufgerufen, wenn beim Verbinden des Clients mit dem Dienst ein Fehler aufgetreten ist. |
Sie sollten den Standortclient in erstellen onCreate() Methode Ihrer Aktivitätsklasse, dann verbinden Sie es in onStart(), damit die Standortdienste den aktuellen Standort beibehalten, während Ihre Aktivität vollständig sichtbar ist. Sie sollten den Client in trennen onStop()Methode, sodass Location Services den aktuellen Standort nicht verwaltet, wenn Ihre App nicht sichtbar ist. Dies hilft, Batteriestrom weitgehend einzusparen.
Holen Sie sich den aktualisierten Speicherort
Wenn Sie bereit sind, Standortaktualisierungen vorzunehmen, müssen Sie neben den oben genannten Schnittstellen auch diese implementieren LocationListenerSchnittstelle auch. Diese Schnittstelle bietet die folgende Rückrufmethode, die Sie in Ihrer Aktivitätsklasse implementieren müssen:
Sr.Nr. | Rückrufmethode & Beschreibung |
---|---|
1 | abstract void onLocationChanged(Location location) Diese Rückrufmethode wird zum Empfangen von Benachrichtigungen vom LocationClient verwendet, wenn sich der Standort geändert hat. |
Standort Servicequalität
Das LocationRequest Das Objekt wird verwendet, um eine Dienstgüte (Quality of Service, QoS) für Standortaktualisierungen von der anzufordern LocationClient. Es gibt folgende nützliche Setter-Methoden, mit denen Sie QoS handhaben können. Es stehen gleichwertige Getter-Methoden zur Verfügung, die Sie in der offiziellen Android-Dokumentation überprüfen können.
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | setExpirationDuration(long millis) Legen Sie die Dauer dieser Anforderung in Millisekunden fest. |
2 | setExpirationTime(long millis) Stellen Sie die Ablaufzeit der Anforderung in Millisekunden seit dem Start ein. |
3 | setFastestInterval(long millis) Legen Sie explizit das schnellste Intervall für Standortaktualisierungen in Millisekunden fest. |
4 | setInterval(long millis) Stellen Sie das gewünschte Intervall für aktive Standortaktualisierungen in Millisekunden ein. |
5 | setNumUpdates(int numUpdates) Legen Sie die Anzahl der Standortaktualisierungen fest. |
6 | setPriority(int priority) Legen Sie die Priorität der Anforderung fest. |
Wenn Ihre Anwendung beispielsweise einen Standort mit hoher Genauigkeit wünscht, sollte sie eine Standortanforderung mit erstellen setPriority(int) auf PRIORITY_HIGH_ACCURACY setzen und setInterval(long)bis 5 Sekunden. Sie können auch größere Intervalle und / oder andere Prioritäten wie PRIORITY_LOW_POWER verwenden, um die Genauigkeit der Ebene "Stadt" anzufordern, oder PRIORITY_BALANCED_POWER_ACCURACY für die Genauigkeit der Ebene "Block".
Bei Aktivitäten sollte unbedingt in Betracht gezogen werden, alle Standortanforderungen bei der Eingabe des Hintergrunds zu entfernen (z. B. bei onPause ()) oder die Anforderung zumindest in ein größeres Intervall und eine geringere Qualität zu verschieben, um Stromverbrauch zu sparen.
Anzeigen einer Standortadresse
Sobald du hast Location Objekt können Sie verwenden Geocoder.getFromLocation()Methode, um eine Adresse für einen bestimmten Breiten- und Längengrad zu erhalten. Diese Methode ist synchron und kann lange dauern. Daher sollten Sie die Methode von der aus aufrufendoInBackground() Methode eines AsyncTask Klasse.
Das AsyncTask muss eine Unterklasse sein, um verwendet zu werden, und die Unterklasse wird überschrieben doInBackground(Params...) Methode, um eine Aufgabe im Hintergrund auszuführen und onPostExecute(Result)Die Methode wird im UI-Thread nach Abschluss der Hintergrundberechnung und zum Zeitpunkt der Anzeige des Ergebnisses aufgerufen. In AyncTask steht eine weitere wichtige Methode zur Verfügung:execute(Params... params)Diese Methode führt die Aufgabe mit den angegebenen Parametern aus.
Beispiel
Das folgende Beispiel zeigt Ihnen in der Praxis, wie Sie mithilfe von Standortdiensten in Ihrer App den aktuellen Standort und die entsprechenden Adressen usw. abrufen.
Um mit diesem Beispiel zu experimentieren, benötigen Sie ein aktuelles Mobilgerät, das mit dem neuesten Android-Betriebssystem ausgestattet ist. Andernfalls müssen Sie mit dem Emulator kämpfen, der möglicherweise nicht funktioniert.
Erstellen Sie eine Android-Anwendung
Schritt | Beschreibung |
---|---|
1 | Mit der Android Studio-IDE erstellen Sie eine Android-Anwendung und benennen sie unter dem Paket com.example.tutorialspoint7.myapplication als Tutorialspoint . |
2 | hinzufügen src / GPSTracker.java Datei und die erforderlichen Code hinzufügen. |
3 | Ändern src / MainActivity.java Datei und fügen Sie erforderlichen Code wie unten gezeigt kümmern aktuellen Standort und deren Äquivalent - Adresse zu bekommen. |
4 | Ändern Sie die Layout-XML-Datei res / layout / activity_main.xml , um alle GUI-Komponenten hinzuzufügen, die drei Schaltflächen und zwei Textansichten enthalten, um Speicherort / Adresse anzuzeigen. |
5 | Ändern Sie res / values / strings.xml , um die erforderlichen konstanten Werte zu definieren |
6 | Modify AndroidManifest.xml wie unten gezeigt |
7 | Führen Sie die Anwendung aus, um den Android-Emulator zu starten, und überprüfen Sie das Ergebnis der in der Anwendung vorgenommenen Änderungen. |
Es folgt der Inhalt der geänderten Hauptaktivitätsdatei MainActivity.java.
package com.example.tutorialspoint7.myapplication;
import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.test.mock.MockPackageManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btnShowLocation;
private static final int REQUEST_CODE_PERMISSION = 2;
String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;
// GPSTracker class
GPSTracker gps;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
if (ActivityCompat.checkSelfPermission(this, mPermission)
!= MockPackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{mPermission},
REQUEST_CODE_PERMISSION);
// If any permission above not allowed by user, this condition will
execute every time, else your else part will work
}
} catch (Exception e) {
e.printStackTrace();
}
btnShowLocation = (Button) findViewById(R.id.button);
// show location button click event
btnShowLocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// create class object
gps = new GPSTracker(MainActivity.this);
// check if GPS enabled
if(gps.canGetLocation()){
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
// \n is for new line
Toast.makeText(getApplicationContext(), "Your Location is - \nLat: "
+ latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
}else{
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
gps.showSettingsAlert();
}
}
});
}
}
Es folgt der Inhalt der geänderten Hauptaktivitätsdatei GPSTracker.java.
package com.example.tutorialspoint7.myapplication;
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
public class GPSTracker extends Service implements LocationListener {
private final Context mContext;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
// flag for GPS status
boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;
public GPSTracker(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
/**
* Stop using GPS listener
* Calling this function will stop using GPS in your app
* */
public void stopUsingGPS(){
if(locationManager != null){
locationManager.removeUpdates(GPSTracker.this);
}
}
/**
* Function to get latitude
* */
public double getLatitude(){
if(location != null){
latitude = location.getLatitude();
}
// return latitude
return latitude;
}
/**
* Function to get longitude
* */
public double getLongitude(){
if(location != null){
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
/**
* Function to check GPS/wifi enabled
* @return boolean
* */
public boolean canGetLocation() {
return this.canGetLocation;
}
/**
* Function to show settings alert dialog
* On pressing Settings button will lauch Settings Options
* */
public void showSettingsAlert(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing Settings button
alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
});
// on pressing cancel button
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
Es folgt der Inhalt von res/layout/activity_main.xml Datei -
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:orientation = "vertical" >
<Button
android:id = "@+id/button"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:text = "getlocation"/>
</LinearLayout>
Es folgt der Inhalt von res/values/strings.xml zwei neue Konstanten definieren -
<?xml version = "1.0" encoding = "utf-8"?>
<resources>
<string name = "app_name">Tutorialspoint</string>
</resources>
Es folgt der Standardinhalt von AndroidManifest.xml - -
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.example.tutorialspoint7.myapplication">
<uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name = "android.permission.INTERNET" />
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Lassen Sie uns versuchen, Ihre auszuführen TutorialspointAnwendung. Ich gehe davon aus, dass Sie Ihr aktuelles Android Mobile-Gerät mit Ihrem Computer verbunden haben. Um die App in Android Studio auszuführen, öffnen Sie eine der Aktivitätsdateien Ihres Projekts und klicken Sie in
Um den Standort anzuzeigen, wählen Sie die Schaltfläche Standort abrufen, um die Standortinformationen wie folgt anzuzeigen: