Created
June 29, 2020 19:23
-
-
Save Eduardo-Nunes/3fa8abc70330d524b0bf0bd234906521 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.mynuapp; | |
import android.app.AlertDialog; | |
import android.app.Service; | |
import android.content.Context; | |
import android.content.DialogInterface; | |
import android.content.Intent; | |
import android.content.pm.PackageManager; | |
import android.location.Address; | |
import android.location.Geocoder; | |
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.support.v4.app.ActivityCompat; | |
import android.util.Log; | |
import java.io.IOException; | |
import java.util.List; | |
import java.util.Locale; | |
/** | |
* add by eduardo on 14/11/15. | |
*/ | |
/** | |
* Create this Class from tutorial : | |
* http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial | |
* <p> | |
* For Geocoder read this : http://stackoverflow.com/questions/472313/android-reverse-geocoding-getfromlocation | |
*/ | |
public class GPSTracker extends Service implements LocationListener { | |
// 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 | |
// Get Class Name | |
private static String TAG = GPSTracker.class.getName(); | |
private final Context mContext; | |
// Declaring a Location Manager | |
protected LocationManager locationManager; | |
// flag for GPS Status | |
boolean isGPSEnabled = false; | |
// flag for network status | |
boolean isNetworkEnabled = false; | |
// flag for GPS Tracking is enabled | |
boolean isGPSTrackingEnabled = false; | |
Location location; | |
double latitude; | |
double longitude; | |
// How many Geocoder should return our GPSTracker | |
int geocoderMaxResults = 1; | |
// Store LocationManager.GPS_PROVIDER or LocationManager.NETWORK_PROVIDER information | |
private String provider_info; | |
public GPSTracker(Context context) { | |
this.mContext = context; | |
getLocation(); | |
} | |
/** | |
* Try to get my current location by GPS or Network Provider | |
*/ | |
public void getLocation() throws SecurityException{ | |
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); | |
// Try to get location if you GPS Service is enabled | |
if (isGPSEnabled) { | |
this.isGPSTrackingEnabled = true; | |
// Log.d(TAG, "Application use GPS Service"); | |
/* | |
* This provider determines location using | |
* satellites. Depending on conditions, this provider may take a while to return | |
* a location fix. | |
*/ | |
provider_info = LocationManager.GPS_PROVIDER; | |
} else if (isNetworkEnabled) { // Try to get location if you Network Service is enabled | |
this.isGPSTrackingEnabled = true; | |
// Log.d(TAG, "Application use Network State to get GPS coordinates"); | |
/* | |
* This provider determines location based on | |
* availability of cell tower and WiFi access points. Results are retrieved | |
* by means of a network lookup. | |
*/ | |
provider_info = LocationManager.NETWORK_PROVIDER; | |
} | |
// Application can use GPS or Network Provider | |
if (!provider_info.isEmpty()) { | |
locationManager.requestLocationUpdates( | |
provider_info, | |
MIN_TIME_BW_UPDATES, | |
MIN_DISTANCE_CHANGE_FOR_UPDATES, | |
this | |
); | |
if (locationManager != null) { | |
location = locationManager.getLastKnownLocation(provider_info); | |
updateGPSCoordinates(); | |
} | |
} | |
} catch (Exception e) { | |
//e.printStackTrace(); | |
Log.e(TAG, "Impossible to connect to LocationManager", e); | |
} | |
} | |
/** | |
* Update GPSTracker latitude and longitude | |
*/ | |
public void updateGPSCoordinates() { | |
if (location != null) { | |
latitude = location.getLatitude(); | |
longitude = location.getLongitude(); | |
} | |
} | |
/** | |
* GPSTracker latitude getter and setter | |
* | |
* @return latitude | |
*/ | |
public double getLatitude() { | |
if (location != null) { | |
latitude = location.getLatitude(); | |
} | |
return latitude; | |
} | |
/** | |
* GPSTracker longitude getter and setter | |
* | |
* @return | |
*/ | |
public double getLongitude() { | |
if (location != null) { | |
longitude = location.getLongitude(); | |
} | |
return longitude; | |
} | |
/** | |
* GPSTracker isGPSTrackingEnabled getter. | |
* Check GPS/wifi is enabled | |
*/ | |
public boolean getIsGPSTrackingEnabled() { | |
return this.isGPSTrackingEnabled; | |
} | |
/** | |
* Stop using GPS listener | |
* Calling this method will stop using GPS in your app | |
*/ | |
public void stopUsingGPS() throws SecurityException{ | |
if (locationManager != null) { | |
locationManager.removeUpdates(GPSTracker.this); | |
} | |
} | |
/** | |
* Function to show settings alert dialog | |
*/ | |
public void showSettingsAlert() { | |
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); | |
//Setting Dialog Title | |
alertDialog.setTitle(R.string.GPSAlertDialogTitle); | |
//Setting Dialog Message | |
alertDialog.setMessage(R.string.GPSAlertDialogMessage); | |
//On Pressing Setting button | |
alertDialog.setPositiveButton(R.string.action_settings, new DialogInterface.OnClickListener() { | |
@Override | |
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(R.string.cancel, new DialogInterface.OnClickListener() { | |
@Override | |
public void onClick(DialogInterface dialog, int which) { | |
dialog.cancel(); | |
} | |
}); | |
alertDialog.show(); | |
} | |
/** | |
* Get list of address by latitude and longitude | |
* | |
* @return null or List<Address> | |
*/ | |
public List<Address> getGeocoderAddress(Context context) { | |
if (location != null) { | |
Geocoder geocoder = new Geocoder(context, Locale.ENGLISH); | |
try { | |
/** | |
* Geocoder.getFromLocation - Returns an array of Addresses | |
* that are known to describe the area immediately surrounding the given latitude and longitude. | |
*/ | |
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, this.geocoderMaxResults); | |
return addresses; | |
} catch (IOException e) { | |
//e.printStackTrace(); | |
Log.e(TAG, "Impossible to connect to Geocoder", e); | |
} | |
} | |
return null; | |
} | |
/** | |
* Try to get AddressLine | |
* | |
* @return null or addressLine | |
*/ | |
public String getAddressLine(Context context) { | |
List<Address> addresses = getGeocoderAddress(context); | |
if (addresses != null && addresses.size() > 0) { | |
Address address = addresses.get(0); | |
String addressLine = address.getAddressLine(0); | |
return addressLine; | |
} else { | |
return null; | |
} | |
} | |
/** | |
* Try to get Locality | |
* | |
* @return null or locality | |
*/ | |
public String getLocality(Context context) { | |
List<Address> addresses = getGeocoderAddress(context); | |
if (addresses != null && addresses.size() > 0) { | |
Address address = addresses.get(0); | |
String locality = address.getLocality(); | |
return locality; | |
} else { | |
return null; | |
} | |
} | |
/** | |
* Try to get Postal Code | |
* | |
* @return null or postalCode | |
*/ | |
public String getPostalCode(Context context) { | |
List<Address> addresses = getGeocoderAddress(context); | |
if (addresses != null && addresses.size() > 0) { | |
Address address = addresses.get(0); | |
String postalCode = address.getPostalCode(); | |
return postalCode; | |
} else { | |
return null; | |
} | |
} | |
/** | |
* Try to get CountryName | |
* | |
* @return null or postalCode | |
*/ | |
public String getCountryName(Context context) { | |
List<Address> addresses = getGeocoderAddress(context); | |
if (addresses != null && addresses.size() > 0) { | |
Address address = addresses.get(0); | |
String countryName = address.getCountryName(); | |
return countryName; | |
} else { | |
return null; | |
} | |
} | |
@Override | |
public void onLocationChanged(Location location) { | |
} | |
@Override | |
public void onStatusChanged(String provider, int status, Bundle extras) { | |
} | |
@Override | |
public void onProviderEnabled(String provider) { | |
} | |
@Override | |
public void onProviderDisabled(String provider) { | |
} | |
@Override | |
public IBinder onBind(Intent intent) { | |
return null; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment