From 05f03941da6b1fea26cbe5196d4a59bdfba11598 Mon Sep 17 00:00:00 2001 From: Geoffrey POUZET Date: Thu, 2 Aug 2018 14:45:28 +0200 Subject: [PATCH] Add the current position on the map. --- .../mytrackingdog/MainActivity.java | 45 ++++++++++++++ .../mytrackingdog/services/IServiceGps.java | 8 +++ .../mytrackingdog/services/ServiceGps.java | 60 +++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 app/src/main/java/fr/chteufleur/mytrackingdog/services/IServiceGps.java create mode 100644 app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java b/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java index 8f91b28..70dcd2c 100644 --- a/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java +++ b/app/src/main/java/fr/chteufleur/mytrackingdog/MainActivity.java @@ -3,11 +3,14 @@ package fr.chteufleur.mytrackingdog; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; +import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; +import android.util.DisplayMetrics; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; @@ -18,9 +21,19 @@ import org.osmdroid.config.Configuration; import org.osmdroid.tileprovider.tilesource.TileSourceFactory; import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; +import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider; +import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; + +import fr.chteufleur.mytrackingdog.services.IServiceGps; +import fr.chteufleur.mytrackingdog.services.ServiceGps; public class MainActivity extends AppCompatActivity { + public static final String TAG = "MainActivity"; + + private MyLocationNewOverlay mLocationOverlay; + private IServiceGps serviceGps = null; + Context ctx = null; MapView map = null; @@ -57,6 +70,10 @@ public class MainActivity extends AppCompatActivity { checkPermissions(); } + if (serviceGps == null) { + serviceGps = new ServiceGps(); + } + //load/initialize the osmdroid configuration, this can be done ctx = getApplicationContext(); Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)); @@ -84,10 +101,25 @@ public class MainActivity extends AppCompatActivity { mapController.setZoom(11.0); GeoPoint startPoint = new GeoPoint(45.0000, 5.0000); mapController.setCenter(startPoint); + + + final DisplayMetrics dm = ctx.getResources().getDisplayMetrics(); + this.mLocationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(ctx), map); + map.getOverlays().add(this.mLocationOverlay); + mLocationOverlay.enableMyLocation(); + mLocationOverlay.enableFollowLocation(); + mLocationOverlay.setOptionsMenuEnabled(true); } public void onResume(){ super.onResume(); + + ((ServiceGps) serviceGps).setLocationManager((LocationManager) getSystemService(ctx.LOCATION_SERVICE)); + serviceGps.start(); + + mLocationOverlay.enableFollowLocation(); + mLocationOverlay.enableMyLocation(); + //this will refresh the osmdroid configuration on resuming. //if you make changes to the configuration, use //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); @@ -99,6 +131,10 @@ public class MainActivity extends AppCompatActivity { public void onPause(){ super.onPause(); + + mLocationOverlay.disableFollowLocation(); + mLocationOverlay.disableMyLocation(); + //this will refresh the osmdroid configuration on resuming. //if you make changes to the configuration, use //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); @@ -108,6 +144,13 @@ public class MainActivity extends AppCompatActivity { } } + public void onBackPressed() { + super.onBackPressed(); + if (serviceGps != null) { + serviceGps.stop(); + } + } + @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. @@ -130,6 +173,8 @@ public class MainActivity extends AppCompatActivity { return super.onOptionsItemSelected(item); } + + @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/services/IServiceGps.java b/app/src/main/java/fr/chteufleur/mytrackingdog/services/IServiceGps.java new file mode 100644 index 0000000..2f56aeb --- /dev/null +++ b/app/src/main/java/fr/chteufleur/mytrackingdog/services/IServiceGps.java @@ -0,0 +1,8 @@ +package fr.chteufleur.mytrackingdog.services; + +public interface IServiceGps { + + public void start(); + public void stop(); + +} diff --git a/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java new file mode 100644 index 0000000..2c20562 --- /dev/null +++ b/app/src/main/java/fr/chteufleur/mytrackingdog/services/ServiceGps.java @@ -0,0 +1,60 @@ +package fr.chteufleur.mytrackingdog.services; + +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Bundle; +import android.util.Log; + +import fr.chteufleur.mytrackingdog.MainActivity; + +public class ServiceGps implements IServiceGps, LocationListener { + + private static final String TAG = "ServiceGps"; + private LocationManager locationManager; + private Location currentLocation = null; + + public void setLocationManager(LocationManager locationManager) { + this.locationManager = locationManager; + } + + public Location getCurrentLocation() { + return currentLocation; + } + + + @Override + public void start() { + try { + this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this); + } catch (SecurityException ex) { + Log.e(TAG, "Location permission is not activated.", ex); + } + } + + @Override + public void stop() { + this.locationManager.removeUpdates(this); + } + + + @Override + public void onLocationChanged(Location location) { + currentLocation = location; + } + + @Override + public void onStatusChanged(String s, int i, Bundle bundle) { + stop(); + } + + @Override + public void onProviderEnabled(String s) { + start(); + } + + @Override + public void onProviderDisabled(String s) { + stop(); + } +}