Sunday, 9 July 2017

How to convert GPS Coordinates ( Latitude and Longitude ) to Address in Android.

Manifest
<uses-permission android:name="android.permission.INTERNET" />  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


activity.gps.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android" 
 xmlns:app="http://schemas.android.com/apk/res-auto"   
 xmlns:tools="http://schemas.android.com/tools"    
  android:layout_width="match_parent"   
  android:layout_height="match_parent"  
  android:orientation="vertical"   
  tools:context="raj.sujeet.com.example.GPSActivity"    
android:weightSum="1">
<Button
     android:id="@+id/getLL"      
  android:layout_width="match_parent"       
 android:layout_height="wrap_content"      
  android:text="get Lati/long"       
 tools:layout_editor_absoluteX="39dp"      
  tools:layout_editor_absoluteY="28dp"        
android:layout_marginTop="10dp"        
tools:ignore="MissingConstraints"       
android:layout_weight="0.01" />
<EditText
android:id="@+id/latitude"      
  android:layout_marginTop="10dp"      
  android:layout_width="match_parent" 
       android:layout_height="wrap_content" />

    <EditText     
   android:id="@+id/longitude"    
    android:layout_marginTop="10dp"    
    android:layout_width="match_parent"   
     android:layout_height="wrap_content" />

    <Button        
android:id="@+id/getLocation" 
       android:layout_marginTop="20dp"
        android:layout_width="match_parent"  
      android:layout_height="wrap_content"  
      android:text="get location"        />

    <TextView  
      android:layout_margin="10dp" 
       android:id="@+id/result"  
      android:layout_width="wrap_content" 
       android:layout_height="wrap_content"        />

</LinearLayout>





GPSActivity.java

public class GPSActivity extends AppCompatActivity {

    Button getLL,getlocation;
    EditText latitudeLL,longitudeLL;

    String lati,longi;

    TextView result;
    Geocoder geocoder;
    List<Address> addressList;

    // GPSTracker class    GPSTracker gps;

    Context mContext;

    double latitude,longitude;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gps);

        result = (TextView)findViewById(R.id.result);
        geocoder = new Geocoder(this, Locale.getDefault());


        latitudeLL = (EditText)findViewById(R.id.latitude);
        longitudeLL = (EditText)findViewById(R.id.longitude);

        getlocation = (Button)findViewById(R.id.getLocation);

        mContext = this;

        getLL = (Button)findViewById(R.id.getLL);
        getLL.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View view) {


                if (ContextCompat.checkSelfPermission(mContext,
                        Manifest.permission.ACCESS_FINE_LOCATION)
 != PackageManager.PERMISSION_GRANTED                      
  && ActivityCompat.checkSelfPermission(mContext,
                        Manifest.permission.ACCESS_COARSE_LOCATION) 
!= PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(GPSActivity.this,
                            new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

                } else {
                    Toast.makeText(mContext, "You need have granted permission",
 Toast.LENGTH_SHORT).show();
                    gps = new GPSTracker(mContext, GPSActivity.this);

                    // Check if GPS enabled                 
   if (gps.canGetLocation()) {

                         latitude = gps.getLatitude();
                        longitude = gps.getLongitude();

                        // \n is for new line         
               Toast.makeText(getApplicationContext(),
                                "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                         lati = Double.toString(latitude);
                         longi = Double.toString(longitude);
                        latitudeLL.setText(lati);
                        longitudeLL.setText(longi);
                    } else {
                        // Can't get location.                  
      // GPS or network is not enabled.                      
  // Ask user to enable GPS/network in settings.          
              gps.showSettingsAlert();
                    }
                }

            }
        });

        getlocation.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View view) {
                try {
                    addressList = geocoder.getFromLocation(latitude,longitude,1);

                    String addressStr = addressList.get(0).getAddressLine(0);
                    String areaStr = addressList.get(0).getLocality();
                    String cityStr = addressList.get(0).getAdminArea();
                    String countryStr = addressList.get(0).getCountryName();
                    String postalcodeStr = addressList.get(0).getPostalCode();

                    String fullAddress = addressStr+", "+areaStr+", "+cityStr+", "+countryStr+", "+postalcodeStr;

                    result.setText(fullAddress);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

    }

    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions,
 int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case 1: {
                // 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.
                    gps = new GPSTracker(mContext, GPSActivity.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();
                    }

                } else {

                    // permission denied, boo! Disable the                   
 // functionality that depends on this permission.
                    Toast.makeText(mContext, "You need to grant permission",
 Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }
}




GPSTracker.java

package raj.sujeet.com.example;

import android.Manifest;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
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.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.util.Log;

/** * Created by Sujeet Raj on 09-07-2017. */
public class GPSTracker extends Service {

    private 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 = 1000; 
// 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;

    Activity activity;

    public GPSTracker() {
    }

    public GPSTracker(Context context, Activity activity) {
        this.mContext = context;
        this.activity = activity;
        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;
                if (isNetworkEnabled) {
                    int requestPermissionsCode = 50;

                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, mLocationListener);
                    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 latitude/longitude using GPS Services      
      if (isGPSEnabled) {
                if (location == null) {
                    if (ContextCompat.checkSelfPermission(activity, 
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 50);

                    } else {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, mLocationListener);
                        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() {

    }


    private final LocationListener mLocationListener = new LocationListener() {
        @Override        public void onLocationChanged(final Location location) {

            if (location != null) {
                latitude = location.getLatitude();
                longitude = location.getLongitude();
            }
        }

        @Override        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override        public void onProviderEnabled(String provider) {

        }

        @Override        public void onProviderDisabled(String provider) {

        }
    };

    /**     
* 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/Wi-Fi enabled     *   
  * @return boolean     */   
 public boolean canGetLocation() {
        return this.canGetLocation;
    }


    /**     * Function to show settings alert dialog.    
 * On pressing the Settings button it will launch 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 the 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 the cancel button     
   alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        // Showing Alert Message      
  alertDialog.show();
    }


    @Override    public IBinder onBind(Intent arg0) {
        return null;
    }
}

9 comments:

  1. I am getting this issue,,, what to do now ???

    "cannot resolve symbol locationmanager"

    ReplyDelete
    Replies
    1. you are getting the issue probably because you have not imported the Location Mananger Class
      press ALT+Enter to import class !!

      Delete
  2. Someon explain i dont get it at all

    ReplyDelete
  3. I am getting indexoutofbound at this point please help String addressStr = addressList.get(0).getAddressLine(0);

    ReplyDelete
  4. At some point in time, degrees, minutes and seconds that had been used to designate coordinates find coordinates

    ReplyDelete