This example helps you to find the location in Android using the GPS.
I have commented out some functionality in the code. You can uncomment it and extend it at your wish.
At first we will create a utility class that will handle all GPS related Operations.
GPS Utility Class
This class has all utility functions for getting location details such as Latitude and Longitude, Geocoder etc.
GPS.java
package tech_app.coderzheaven.com.tech_app; import android.Manifest; 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.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.provider.Settings; import android.util.Log; import android.widget.Toast; import java.io.IOException; import java.util.List; import java.util.Locale; public class GPS extends Service implements LocationListener { // Get Class Name private static String TAG = GPS.class.getName(); private final Context mContext; // 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 GPS int geocoderMaxResults = 1; // The minimum distance to change updates in meters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; // 10 meters // The minimum time between updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 5000; // 1 minute // Declaring a Location Manager protected LocationManager locationManager; // Store LocationManager.GPS_PROVIDER or LocationManager.NETWORK_PROVIDER information private String provider_info; private Handler locationHandler; public GPS(Context context, Handler locationHandler) { this.mContext = context; this.locationHandler = locationHandler; getLocation(); } /** * Try to get my current location by GPS or Network Provider */ public void 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); // 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()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (mContext.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && mContext.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } } 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 GPS latitude and longitude */ public void updateGPSCoordinates() { if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } /** * GPS latitude getter and setter * * @return latitude */ public double getLatitude() { if (location != null) { latitude = location.getLatitude(); } return latitude; } /** * GPS longitude getter and setter * * @return */ public double getLongitude() { if (location != null) { longitude = location.getLongitude(); } return longitude; } /** * GPS 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() { if (locationManager != null) { locationManager.removeUpdates(GPS.this); } } /** * Function to show settings alert dialog */ public void showSettingsAlert() { AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); //Setting Dialog Title alertDialog.setTitle(R.string.gps_title); //Setting Dialog Message alertDialog.setMessage(R.string.gps_message); //On Pressing Setting button alertDialog.setPositiveButton(R.string.gps_allow, 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) { if (null != locationHandler) { Message message = new Message(); message.obj = location; locationHandler.sendMessage(message); } Toast.makeText(mContext, "onLocationChanged : " + location.getLatitude() + ", lon : " + location.getLongitude(), Toast.LENGTH_SHORT).show(); Log.i("GPS", "onLocationChanged : " + location.getLatitude() + ", lon : " + location.getLongitude()); } @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; } }
Checking for Permission
Android M requires checking for permisson. If the user allows to access the location, then only the app can get Location details.
Below code helps you to ask for permission.
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_PERMISSION); return; }
Handle Permissions CallBack
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case LOCATION_PERMISSION: { Log.i("Camera", "G : " + grantResults[0]); // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. // if (ActivityCompat.shouldShowRequestPermissionRationale // (this, Manifest.permission.CAMERA)) { // // showAlert(); // // } else { // // } } return; } // other 'case' lines to check for other // permissions this app might request } }
MainActivity
Now the MainActivity that uses this utility class to get the location details.
package tech_app.coderzheaven.com.tech_app; import android.Manifest; import android.content.pm.PackageManager; import android.location.Location; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements Handler.Callback { GPS gps; public static String TAG = MainActivity.class.getSimpleName(); private static final int LOCATION_PERMISSION = 200; private TextView mStatus; private Handler locationHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_PERMISSION); return; } mStatus = (TextView) findViewById(R.id.locationTxt); locationHandler = new Handler(this); // check if GPS enabled gps = new GPS(this, locationHandler); if (gps.getIsGPSTrackingEnabled()) { gps.getLocation(); Log.i(TAG, "Lat : " + gps.getLatitude() + ", Long : " + gps.getLongitude()); } else { // can't get location // GPS or Network is not enabled // Ask user to enable GPS/network in settings gps.showSettingsAlert(); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case LOCATION_PERMISSION: { Log.i("Camera", "G : " + grantResults[0]); // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. // if (ActivityCompat.shouldShowRequestPermissionRationale // (this, Manifest.permission.CAMERA)) { // // showAlert(); // // } else { // // } } return; } // other 'case' lines to check for other // permissions this app might request } } @Override public boolean handleMessage(Message message) { Location location = (Location) message.obj; Log.i(TAG, "location :" + location.getLatitude() + ", " + location.getLongitude()); mStatus.setText("location :" + location.getLatitude() + ", " + location.getLongitude()); return false; } }
Source Code
You can download the complete source code from here.