¿Cómo obtener la dirección completa de latitud y longitud?


203

Quiero obtener los siguientes valores de Latitud y Longitud en Android

  1. Dirección
  2. Estado de la Ciudad
  3. Código Postal
  4. Completa tu direccion

¿Cómo lograr esto?


2
Debe usar la API inversa de Google para lo mismo
Lucifer

Pero a veces no tenemos la ciudad en la dirección Línea 1 y el país en la Línea 2 ... el código está aquí
chiragkyada

Respuestas:


508
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());

addresses = geocoder.getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5

String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName(); // Only if available else return NULL

Para obtener más información sobre los detalles disponibles, consulte la dirección de ubicación de Android


la dirección que ha proporcionado es la dirección completa o la dirección?
UMAR-MOBITSOLUTIONS

dirección es una dirección de calle, también miro direcciones enumerar Creo que contiene todos los detalles que necesita ..
user370305

9
getAddressLine()no es confiable para obtener ciudad / país ya que las líneas de dirección pueden variar según el nivel de detalle de geocodificación. Uso getLocality()y en su getCountryName()lugar.
akhy

10
@Shubh - Prueba esta url - "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + latitude + ","+ longitude + "&sensor=true". Devolverá la respuesta de Json.
user370305

8
La búsqueda del geocodificador puede llevar mucho tiempo. Es mucho mejor llamarlo un hilo separado. Como en el ejemplo de Google Doc
Jadamec

63

Prueba esto mi amigo

 private String getCompleteAddressString(double LATITUDE, double LONGITUDE) {
            String strAdd = "";
            Geocoder geocoder = new Geocoder(this, Locale.getDefault());
            try {
                List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);
                if (addresses != null) {
                    Address returnedAddress = addresses.get(0);
                    StringBuilder strReturnedAddress = new StringBuilder("");

                    for (int i = 0; i <= returnedAddress.getMaxAddressLineIndex(); i++) {
                        strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
                    }
                    strAdd = strReturnedAddress.toString();
                    Log.w("My Current loction address", strReturnedAddress.toString());
                } else {
                    Log.w("My Current loction address", "No Address returned!");
                }
            } catch (Exception e) {
                e.printStackTrace();
                Log.w("My Current loction address", "Canont get Address!");
            }
            return strAdd;
        }

Nice Anwer. Gracias.
Steve

En el uso for-loop, i <=
returnAddress.getMaxAddressLineIndex

da java.lang.IndexOutOfBoundsException: Índice: 0, Tamaño: 0
Aleem Momin

25

Ciudad y país no siempre están en la dirección Línea 1 y Línea 2 ...

El ejemplo está aquí.

Entonces,

Geocoder geocoder = new Geocoder(context, Locale.getDefault());

List<Address> addresses  = geocoder.getFromLocation(latitude,longitude, 1);
String address = addresses.get(0).getAddressLine(0);
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String zip = addresses.get(0).getPostalCode();
String country = addresses.get(0).getCountryName();

24

Hay un último truco para obtener la dirección de Lat-Long (Geo-coordenadas). Simplemente puede presionar el servicio web google-maps pasando la latitud y longitud. Es simplemente un servicio web GET-Method.

Devolverá la respuesta JSON que se puede analizar fácilmente para obtener la dirección. La URL para esto es:

http://maps.googleapis.com/maps/api/geocode/json?latlng=32,75&sensor=true

Puede reemplazar 32,75 con lat, largo .


¿Está esto documentado en alguna parte ...?
Derek 朕 會 功夫

55
ahora está en desuso.
amit bansode

8

En onCreate () ..

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, this);
    Criteria criteria = new Criteria();
    String bestProvider = locationManager.getBestProvider(criteria, true);
    Location location = locationManager.getLastKnownLocation(bestProvider);

    if (location == null) {
        Toast.makeText(getApplicationContext(), "GPS signal not found",
                3000).show();
    }
    if (location != null) {
        Log.e("location", "location--" + location);
        Log.e("latitude at beginning",
                "@@@@@@@@@@@@@@@" + location.getLatitude());
        onLocationChanged(location);
    }

Escriba el código en onLocationChanged ()

@Override
public void onLocationChanged(Location location) {

    Geocoder geocoder;
    List<Address> addresses;
    geocoder = new Geocoder(this, Locale.getDefault());

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

    Log.e("latitude", "latitude--" + latitude);

    try {
        Log.e("latitude", "inside latitude--" + latitude);
        addresses = geocoder.getFromLocation(latitude, longitude, 1);

        if (addresses != null && addresses.size() > 0) {
            String address = addresses.get(0).getAddressLine(0); 
            String city = addresses.get(0).getLocality();
            String state = addresses.get(0).getAdminArea();
            String country = addresses.get(0).getCountryName();
            String postalCode = addresses.get(0).getPostalCode();
            String knownName = addresses.get(0).getFeatureName(); 

            locationTxt.setText(address + " " + city + " " + country);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

4

Está buscando el término Geocodificación.

La historia corta es que debes hacer:

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);

Para hacer más, debes leer el Geocoder aquí .


pero debe verificar que su país sea compatible con la geocodificación. elocation.oracle.com/geocoder/gcdemo.jsp
l ק ıllıllı

4
  public static String getAddressFromLatLng(Context context, LatLng latLng) {
    Geocoder geocoder;
    List<Address> addresses;
    geocoder = new Geocoder(context, Locale.getDefault());
    try {
        addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
        return addresses.get(0).getAddressLine(0);
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}

4

Es muy fácil obtener una dirección completa de Latitud y Longitud usando la clase Geocoder. Siguiendo el ejemplo de código. ¡Espero que esto ayude!

 if (l != null) {
        val lat = l.latitude
        val lon = l.longitude

        val geocoder = Geocoder(this, Locale.getDefault())
        val addresses: List<Address>

        addresses = geocoder.getFromLocation(lat, lon, 1) 

        val address = addresses[0].getAddressLine(0)
        val address2 = addresses[0].getAddressLine(1)
        val city = addresses[0].locality
        val state = addresses[0].adminArea
        val country = addresses[0].countryName
        val postalCode = addresses[0].postalCode
        val knownName = addresses[0].featureName

        val message =
                "Emergency situation. Call for help. My location is: " + address + "." + "http://maps.google.com/maps?saddr=" + lat + "," + lon

    }

Puede usar solo el valor de la dirección, ya que le proporciona toda la dirección completa. Si desea componentes individuales, puede usar otros también.


4

Simplemente use este método y pase su lat, largo.

public static void getAddress(Context context, double LATITUDE, double LONGITUDE{
    //Set Address
    try {
        Geocoder geocoder = new Geocoder(context, Locale.getDefault());
        List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);

        if (addresses != null && addresses.size() > 0) {
            String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
            String city = addresses.get(0).getLocality();
            String state = addresses.get(0).getAdminArea();
            String country = addresses.get(0).getCountryName();
            String postalCode = addresses.get(0).getPostalCode();
            String knownName = addresses.get(0).getFeatureName(); // Only if available else return NULL
            Log.d(TAG, "getAddress:  address" + address);
            Log.d(TAG, "getAddress:  city" + city);
            Log.d(TAG, "getAddress:  state" + state);
            Log.d(TAG, "getAddress:  postalCode" + postalCode);
            Log.d(TAG, "getAddress:  knownName" + knownName);
        }

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

2
  Geocoder geocoder =new Geocoder(mContext, Locale.getDefault());
 // Get the current location from the input parameter list
  Location loc = params[0];
 // Create a list to contain the result address
  List<Address> addresses = null;
  try {
     addresses = geocoder.getFromLocation(loc.getLatitude(),
             loc.getLongitude(), 10);
 } catch (IOException e1) {
           Log.e("LocationSampleActivity","IO Exception in getFromLocation()");
      e1.printStackTrace();

 } catch (IllegalArgumentException e2) {
 // Error message to post in the log
 String errorString = "Illegal arguments " +
         Double.toString(loc.getLatitude()) +
         " , " +
         Double.toString(loc.getLongitude()) +
         " passed to address service";
 Log.e("LocationSampleActivity", errorString);
 e2.printStackTrace();

 }
 Address address=null;
 String zip=null;
 String city=null;
 String state=null;
 StringBuffer st=new StringBuffer();
 // If the reverse geocode returned an address
 if (addresses != null && addresses.size() > 0) {
 String       add=addresses.get(0).getAddressLine(0)+","
  +addresses.get(0).getSubAdminArea()+","
  +addresses.get(0).getSubLocality();
  city=addresses.get(0).getLocality();
  state=addresses.get(0).getAdminArea();
     // Get the first address
  for(int i=0 ;i<addresses.size();i++){
  address = addresses.get(i);
   if(address.getPostalCode()!=null){
zip=address.getPostalCode();
break;
     }

      }

2

Puede usar fácilmente el siguiente código para obtener la dirección.

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
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;

public class GPSService extends Service implements LocationListener {

// saving the context for later use
private final Context mContext;

// if GPS is enabled
boolean isGPSEnabled = false;
// if Network is enabled
boolean isNetworkEnabled = false;
// if Location co-ordinates are available using GPS or Network
public boolean isLocationAvailable = false;

// Location and co-ordinates coordinates
Location mLocation;
double mLatitude;
double mLongitude;

// Minimum time fluctuation for next update (in milliseconds)
private static final long TIME = 30000;
// Minimum distance fluctuation for next update (in meters)
private static final long DISTANCE = 20;

// Declaring a Location Manager
protected LocationManager mLocationManager;

public GPSService(Context context) {
    this.mContext = context;
    mLocationManager = (LocationManager) mContext
            .getSystemService(LOCATION_SERVICE);

}

/**
 * Returs the Location
 * 
 * @return Location or null if no location is found
 */
public Location getLocation() {
    try {

        // Getting GPS status
        isGPSEnabled = mLocationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // If GPS enabled, get latitude/longitude using GPS Services
        if (isGPSEnabled) {
            mLocationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, TIME, DISTANCE, this);
            if (mLocationManager != null) {
                mLocation = mLocationManager
                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (mLocation != null) {
                    mLatitude = mLocation.getLatitude();
                    mLongitude = mLocation.getLongitude();
                    isLocationAvailable = true; // setting a flag that
                                                // location is available
                    return mLocation;
                }
            }
        }

        // If we are reaching this part, it means GPS was not able to fetch
        // any location
        // Getting network status
        isNetworkEnabled = mLocationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (isNetworkEnabled) {
            mLocationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, TIME, DISTANCE, this);
            if (mLocationManager != null) {
                mLocation = mLocationManager
                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                if (mLocation != null) {
                    mLatitude = mLocation.getLatitude();
                    mLongitude = mLocation.getLongitude();
                    isLocationAvailable = true; // setting a flag that
                                                // location is available
                    return mLocation;
                }
            }
        }
        // If reaching here means, we were not able to get location neither
        // from GPS not Network,
        if (!isGPSEnabled) {
            // so asking user to open GPS
            askUserToOpenGPS();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    // if reaching here means, location was not available, so setting the
    // flag as false
    isLocationAvailable = false;
    return null;
}

/**
 * Gives you complete address of the location
 * 
 * @return complete address in String
 */
public String getLocationAddress() {

    if (isLocationAvailable) {

        Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
        // Get the current location from the input parameter list
        // Create a list to contain the result address
        List<Address> addresses = null;
        try {
            /*
             * Return 1 address.
             */
            addresses = geocoder.getFromLocation(mLatitude, mLongitude, 1);
        } catch (IOException e1) {
            e1.printStackTrace();
            return ("IO Exception trying to get address:" + e1);
        } catch (IllegalArgumentException e2) {
            // Error message to post in the log
            String errorString = "Illegal arguments "
                    + Double.toString(mLatitude) + " , "
                    + Double.toString(mLongitude)
                    + " passed to address service";
            e2.printStackTrace();
            return errorString;
        }
        // If the reverse geocode returned an address
        if (addresses != null && addresses.size() > 0) {
            // Get the first address
            Address address = addresses.get(0);
            /*
             * Format the first line of address (if available), city, and
             * country name.
             */
            String addressText = String.format(
                    "%s, %s, %s",
                    // If there's a street address, add it
                    address.getMaxAddressLineIndex() > 0 ? address
                            .getAddressLine(0) : "",
                    // Locality is usually a city
                    address.getLocality(),
                    // The country of the address
                    address.getCountryName());
            // Return the text
            return addressText;
        } else {
            return "No address found by the service: Note to the developers, If no address is found by google itself, there is nothing you can do about it.";
        }
    } else {
        return "Location Not available";
    }

}



/**
 * get latitude
 * 
 * @return latitude in double
 */
public double getLatitude() {
    if (mLocation != null) {
        mLatitude = mLocation.getLatitude();
    }
    return mLatitude;
}

/**
 * get longitude
 * 
 * @return longitude in double
 */
public double getLongitude() {
    if (mLocation != null) {
        mLongitude = mLocation.getLongitude();
    }
    return mLongitude;
}

/**
 * close GPS to save battery
 */
public void closeGPS() {
    if (mLocationManager != null) {
        mLocationManager.removeUpdates(GPSService.this);
    }
}

/**
 * show settings to open GPS
 */
public void askUserToOpenGPS() {
    AlertDialog.Builder mAlertDialog = new AlertDialog.Builder(mContext);

    // Setting Dialog Title
    mAlertDialog.setTitle("Location not available, Open GPS?")
    .setMessage("Activate GPS to use use location services?")
    .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
            }
        })
        .setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                }
            }).show();
}

/** 
 * Updating the location when location changes
 */
@Override
public void onLocationChanged(Location location) {
    mLatitude = location.getLatitude();
    mLongitude = location.getLongitude();
}

@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;
}

}

2

Puedes crear clase

public class GeoLocation {

private Context mContext;

private String mLatitude;
private String mLongtitude;
private String mStreet;
private String mHouseNumber;
private String mPostalCode;
private String mCity;

private Location mMarkerLocation;

public GeoLocation (Context context) {
    mContext = context;
}

public String getStreet () {
    return mStreet;
}

public String getHouseNumber () {
    return mHouseNumber;
}

public String getPostalCode () {
    return mPostalCode;
}

public String getCity () {
    return mCity;
}

public String getLatitude () {
    return mLatitude;
}

public String getLongtitude () {
    return mLongtitude;
}

// Lookup address via reverse geolocation
// Call this one
public void lookUpAddress (Location markerLocation) {
    mMarkerLocation = markerLocation;
    if (Geocoder.isPresent()) {
        (new GetAddressTask(mContext)).execute();
    }
}

public class GetAddressTask extends AsyncTask<android.location.Location, Void, String> {

    public GetAddressTask (Context context) {
        super();
        mContext = context;
    }

    @Override
    protected String doInBackground (android.location.Location... params) {
        Geocoder geocoder =
                new Geocoder(mContext, Locale.getDefault());
        android.location.Location location = params[0];

        List<Address> addresses = null;
        try {
            if (mMarkerLocation != null) {
                addresses = geocoder.getFromLocation(mMarkerLocation.getLatitude(),
                        mMarkerLocation.getLongitude(), 1);
            }
        } catch (IOException exception) {
            Log.e("ComplaintLocation",
                    "IO Exception in getFromLocation()", exception);

            return ("IO Exception trying to get address");
        } catch (IllegalArgumentException exception) {
            String errorString = "Illegal arguments " +
                    Double.toString(location.getLatitude()) + " , " +
                    Double.toString(location.getLongitude()) + " passed to address service";
            Log.e("LocationSampleActivity", errorString, exception);

            return errorString;
        }

        if (addresses != null && addresses.size() > 0) {
            Address address = addresses.get(0);

            if (address.getMaxAddressLineIndex() > 0) {
                return String.format(
                        "%s/%s/%s/%s/%s/%s",
                        address.getLatitude(), // 0
                        address.getLongitude(), // 1
                        address.getThoroughfare(), // 2
                        address.getSubThoroughfare(), //3
                        address.getPostalCode(), // 4
                        address.getLocality()); // 5
            } else {
                return String.format(
                        "%s/%s/%s/%s",
                        address.getLatitude(), // 0
                        address.getLongitude(), // 1
                        address.getPostalCode(), // 2
                        address.getLocality()); // 3
            }
        } else return "No address found";
    }

    // Format address string after lookup
    @Override
    protected void onPostExecute (String address) {

        String[] addressFields = TextUtils.split(address, "/");
        Log.d("ADDRESS ARRAY", Arrays.toString(addressFields));

        // Workaround: doInBackground can only return Strings instead of, for example, an
        // Address instance or a String[] directly. To be able to use TextUtils.isEmpty()
        // on fields returned by this method, set each String that currently reads "null" to
        // a null reference
        for (int fieldcnt = 0; fieldcnt < addressFields.length; ++fieldcnt) {
            if (addressFields[fieldcnt].equals("null"))
                addressFields[fieldcnt] = null;
        }

        switch (addressFields.length) {
            case 4:
                mStreet = null;
                mHouseNumber = null;
                mLatitude = addressFields[0];
                mLongtitude = addressFields[1];
                mPostalCode = addressFields[2];
                mCity = addressFields[3];
                break;
            case 6:
                mLatitude = addressFields[0];
                mLongtitude = addressFields[1];
                mStreet = addressFields[2];
                mHouseNumber = addressFields[3];
                mPostalCode = addressFields[4];
                mCity = addressFields[5];
                break;
            default:
                mLatitude = null;
                mLongtitude = null;
                mStreet = null;
                mHouseNumber = null;
                mPostalCode = null;
                mCity = null;
                break;
        }

        Log.d("GeoLocation Street", mStreet);
        Log.d("GeoLocation No.", mHouseNumber);
        Log.d("GeoLocation Postalcode", mPostalCode);
        Log.d("GeoLocation Locality", mCity);
        Log.d("GeoLocation Lat/Lng", "[" + mLatitude + ", " + mLongtitude + 
    "]");
    }
 }
   }

Luego lo instancia con

GeoLocation geoLocation = new GeoLocation(getActivity()); // or (this) if 
called from an activity and not from a fragment
mGeoLocation.lookUpAddress(LOCATION_FROM_MAP);

2

Parece que nadie ha proporcionado la solución sugerida por Google Docs ( https://developer.android.com/training/location/display-address#java ). La solución correcta debe usar un IntentService para hacer que la red llame a geocodificación inversa.

Se utiliza un servicio de intención en lugar de una AsyncTask, ya que no está vinculado a ninguna actividad específica. es decir. Tiene su propio ciclo de vida. El IntentService se detendrá cuando finalice la Geocodificación.

public class GeocodingService extends IntentService {

    public GeocodingService() {
        super("GeocodingService");
    }


    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        if (intent == null) {
            return;
        }

        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        String errorMessage = "";
        BCCDatabase BCCDatabase = skicompanion.skicompanion.storage.BCCDatabase.getInstance(getApplicationContext());

        // Get the location passed to this service through an extra.
        Location location = intent.getParcelableExtra(
                "location");
        long trackID = intent.getLongExtra("trackID", -1);

        List<Address> addresses = null;
        String addressString = "";

        try {
            addresses = geocoder.getFromLocation(
                    location.getLatitude(),
                    location.getLongitude(),
                    1);
        } catch (IOException ioException) {
            // Catch network or other I/O problems.
            errorMessage = "service not available";
            Log.d(Constants.SkiCompanionDebug, errorMessage, ioException);
        } catch (IllegalArgumentException illegalArgumentException) {
            // Catch invalid latitude or longitude values.
            errorMessage = "invalid lat long used";
            Log.d(Constants.SkiCompanionDebug, errorMessage + ". " +
                    "Latitude = " + location.getLatitude() +
                    ", Longitude = " +
                    location.getLongitude(), illegalArgumentException);
        }

        // Handle case where no address was found.
        if (addresses == null || addresses.size()  == 0) {
            if (errorMessage.isEmpty()) {
                errorMessage = "no address found";
                Log.d(Constants.SkiCompanionDebug, errorMessage);
            }
        } else {
            if(addresses.get(0).getLocality() != null){
                addressString += addresses.get(0).getLocality() + ", ";
            }
            if(addresses.get(0).getAdminArea() != null){
                addressString += addresses.get(0).getAdminArea() + ", ";
            }
            if(addresses.get(0).getCountryName() != null){
                addressString += addresses.get(0).getCountryName();
            }
            //updating DB
            BCCDatabase.setTrackLocation(trackID, addressString);

            Log.d(Constants.SkiCompanionDebug, "address found: "+ addressString);
        }
    }
}

Estoy de acuerdo, debe usar el IntentService para la geocodificación inversa.
mrisek

2

Use esto, me funciona: D

Recupere datos json de la latitud y longitud.

https://maps.googleapis.com/maps/api/geocode/json?key=AIzaSyAr29XeWWAeWZcrOgjjfs3iSnqkWtAz4No&latlng=2.1812,102.4266&sensor=true

Cambia la latitud, la longitud con tu propio lugar.

https://maps.googleapis.com/maps/api/geocode/json?key= <\ API_KEY_HERE> & latlng = "latitude", "longitude" & sensor = true

Puede cambiar el <\ API_KEY_HERE> con su propia clave.

Necesito habilitar el servicio api en la consola de google para la nueva clave api.

Espero que ayude: D


2

1 - Crea variables para LocationManager y LocationListener en el método onCreate.

2 - Verifique si hay un permiso, ejecute las actualizaciones de ubicación y obtenga lastKnownLocation de locationManager, de lo contrario, solicite permiso

3 - Cree onRequestPermissionResult en la clase principal y verifique si hay un permiso, luego ejecute las actualizaciones de ubicación

4 - Cree un método separado que incluya la variable Geocoder y cree una lista para colocar las coordenadas desde su ubicación, para asegurarse de que verifique si la Lista existe y si cada información que queremos en esa lista existe, entonces use (getThoroughfare = => para dirección postal), (getLocality ==> para ciudad / estado), (getPostalCode ==> para código postal), (getAdminArea ==> para dirección completa)

5 - Finalmente, llama a ese método después de verificar el permiso con (parámetro lastKnownLocation ==> para mostrar la dirección cuando se ejecuta la aplicación) y en onLocationChanged con (parámetro de ubicación ==> para mostrar la dirección cuando la ubicación cambia)

Parte del código:

LocationManager locationManager;

LocationListener locationListener;

@SuppressLint("MissingPermission")
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    locationManager  = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {

            updateLocation(location);

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

        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
    };

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

        Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        updateLocation(lastKnownLocation);

    }else {

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
}

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

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        }
    }
}


public void updateLocation ( Location location){


    Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
    try {
        List<Address> listAddresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);

        String address = "Could not find location :(";

        if (listAddresses != null && listAddresses.size() > 0) {

            if (listAddresses.get(0).getThoroughfare() != null) {

                address = listAddresses.get(0).getThoroughfare() + " ";
            }

            if (listAddresses.get(0).getLocality() != null) {

                address += listAddresses.get(0).getLocality() + " ";
            }

            if (listAddresses.get(0).getPostalCode() != null) {

                address += listAddresses.get(0).getPostalCode() + " ";
            }

            if (listAddresses.get(0).getAdminArea() != null) {

                address += listAddresses.get(0).getAdminArea();
            }
        }

        Log.i("Address",address);

    } catch (Exception e) {

        e.printStackTrace();

    }
}
}

1

ingrese la descripción de la imagen aquí

           double latitude = networkLocation.getLatitude();
           double longitude = networkLocation.getLongitude();
           LocationAddress locationAddress = new LocationAddress();
           locationAddress.getAddressFromLocation(latitude , longitude , getApplicationContext(), new GeocoderHandler());

para más información haga clic aquí


64
podemos encontrar la información oculta de su lng y lat
Mina Gabriel

Jajajaja ... ;-P
MAS. John

1

Intenta usar el siguiente código con el geocodificador:

  Geocoder gcd = new Geocoder(MainActivity.this, Locale.getDefault());
  List<Address> geoAddresses = geoAddresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
  if (geoAddresses.size() > 0) {
      String mUserLocation = "";
      for (int i = 0; i < 4; i++) { //Since it return only four value we declare this as static.
           mUserLocation = mUserLocation + geoAddresses.get(0).getAddressLine(i).replace(",", "") + ", ";
        } 
    }

1
public String getAddress(LatLng latLng) {
    String cAddress = "";
    if (latLng == null) {
        errorMessage = "no_location_data_provided";
        Log.wtf(TAG, errorMessage);
        return "";
    }
    Geocoder geocoder = new Geocoder(this, Locale.getDefault());

    // Address found using the Geocoder.
    List<Address> addresses = null;

    try {
        // Using getFromLocation() returns an array of Addresses for the area immediately
        // surrounding the given latitude and longitude. The results are a best guess and are
        // not guaranteed to be accurate.
        addresses = geocoder.getFromLocation(
                latLng.latitude,
                latLng.longitude,
                // In this sample, we get just a single address.
                1);
    } catch (IOException ioException) {
        // Catch network or other I/O problems.
        errorMessage = "service_not_available";
        Log.e(TAG, errorMessage, ioException);
    } catch (IllegalArgumentException illegalArgumentException) {
        // Catch invalid latitude or longitude values.
        errorMessage = "invalid_lat_long_used";
        Log.e(TAG, errorMessage + ". " +
                "Latitude = " + latLng.latitude +
                ", Longitude = " + latLng.longitude, illegalArgumentException);
    }

    // Handle case where no address was found.
    if (addresses == null || addresses.size() == 0) {
        if (errorMessage.isEmpty()) {
            errorMessage = "no_address_found";
            Log.e(TAG, errorMessage);
        }
    } else {
        Address address = addresses.get(0);
        ArrayList<String> addressFragments = new ArrayList<String>();
        // Fetch the address lines using {@code getAddressLine},
        // join them, and send them to the thread. The {@link android.location.address}
        // class provides other options for fetching address details that you may prefer
        // to use. Here are some examples:
        // getLocality() ("Mountain View", for example)
        // getAdminArea() ("CA", for example)
        // getPostalCode() ("94043", for example)
        // getCountryCode() ("US", for example)
        // getCountryName() ("United States", for example)
        String allAddress = "";
        for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
            addressFragments.add(address.getAddressLine(i));
            allAddress += address.getAddressLine(i) + " ";
        }
        if (address.getAdminArea() != null) {
            state = address.getAdminArea();
        } else {
            state = "";
        }
        if (address.getLocality() != null) {
            city = address.getLocality();
        } else {
            city = "";
        }
        if (address.getPostalCode() != null) {
            postalCode = address.getPostalCode();
        } else {
            postalCode = "";
        }

        Log.i(TAG, "address_found");
        //driverAddress = TextUtils.join(System.getProperty("line.separator"), addressFragments);
        cAddress = allAddress;
        Log.e("result", cAddress.toString());
    }
    return cAddress;
}

Puede usar este método para geocodificar la dirección completa correcta


1

Si usa el lenguaje Kotlin, creo este método para obtener la ubicación de la dirección directamente

private fun getAddress(latLng: LatLng): String {

    val geocoder = Geocoder(this, Locale.getDefault())
    val addresses: List<Address>?
    val address: Address?
    var addressText = ""

        addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1)

        if (addresses.isNotEmpty()) {
            address = addresses[0]
                addressText = address.getAddressLine(0)
        }else{
            addressText = "its not appear"
        }
    return addressText
}

pero este método solo devuelve el valor de cadena cuando llama a este método

Si desea obtener todas las direcciones, simplemente use este método / función

fun getAddress(latLng: LatLng){

val geocoder = Geocoder(this, Locale.getDefault())
val addresses: List<Address>?
val address: Address?
var fulladdress = ""
    addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1)

    if (addresses.isNotEmpty()) {
        address = addresses[0]
        fulladdress = address.getAddressLine(0) // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex
        var city = address.getLocality();
        var state = address.getAdminArea();
        var country = address.getCountryName();
        var postalCode = address.getPostalCode();
        var knownName = address.getFeatureName(); // Only if available else return NULL
    }else{
        fulladdress = "Location not found"
    }

}


genial exactamente lo que estaba buscando ... Gracias Azhar
Raghib Arshi

0

Puede hacer esto para obtener una dirección completa de latitud y longitud:

  public class MainActivity extends AppCompatActivity {

         ...

  private Geocoder geocoder;
  private TextView mAddressTxtVu;

         ...


  // I assume that you got latitude and longitude correctly 

  mLatitude  =  20.23232
  mLongitude =  32.999

  String errorMessage = "";

  geocoder = new Geocoder(context, Locale.getDefault());

  List<Address> addresses = null;

  try {
              addresses = geocoder.getFromLocation(
                       mlattitude,
                       mlongitude,
                       1);
      } catch (IOException e) {
              errorMessage = getString(R.string.service_not_available);
              Log.e(TAG, errorMessage, e);
      } catch (IllegalArgumentException illegalArgumentException) {
                        // Catch invalid latitude or longitude values.
              errorMessage = getString(R.string.invalid_lat_long_used);
              Log.e(TAG, errorMessage + ". " + "Latitude = " + mlattitude +", Longitude = " + mlongitude, illegalArgumentException);
      }

      // Handle case where no address was found.
      if (addresses == null || addresses.size() == 0) {
             if (errorMessage.isEmpty()) {
                      errorMessage = getString(R.string.no_address_found);
                      Log.e(TAG, errorMessage);
             }

      } else {
             Address address = addresses.get(0);
             ArrayList<String> addressFragments = new ArrayList<String>();

             // Fetch the address lines using getAddressLine,
             // join them, and send them to the thread.
             for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
                      addressFragments.add(address.getAddressLine(i));
             }
             // Log.i(TAG, getString(R.string.address_found));


    mAddressTxtVu.setText(TextUtils.join(System.getProperty("line.separator"),
                                addressFragments));
                    }

0

Necesita pasar el valor de latitud y longitud.

Geocoder geocoder;
        List<Address> addresses;
        geocoder = new Geocoder(getContext(), Locale.getDefault());

        try {
            addresses = geocoder. getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
            String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
            String city = addresses.get(0).getLocality();
            String state = addresses.get(0).getAdminArea();
            String country = addresses.get(0).getCountryName();
            String postalCode = addresses.get(0).getPostalCode();
            String knownName = addresses.get(0).getFeatureName(); // Only if available else return NULL

            System.out.println(address+"-------------");
        } catch (IOException e) {
            e.printStackTrace();
        }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.