Android: geoencoding inversa – getFromLocation

Estoy tratando de obtener una dirección basada en long / lat. parece que algo como esto debería funcionar?

Geocoder myLocation = Geocoder(Locale.getDefault()); List myList = myLocation.getFromLocation(latPoint,lngPoint,1); 

El problema es que sigo recibiendo: El método Geocoder (Configuración regional) no está definido para el tipo de asignación de archivos.

Cualquier asistencia sería útil. Gracias.


Gracias, probé el contexto, locale primero, y eso falló y estaba mirando a algunos de los otros constructores (había visto uno que había mencionado solo locale). Independientemente,

No funcionó, ya que todavía estoy recibiendo: El método Geocoder (Contexto, Configuración regional) no está definido para el tipo de asignación de archivos.

Tengo: import android.location.Geocoder;

El siguiente fragmento de código lo está haciendo por mí (lat y lng son los dobles declarados por encima de este bit):

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

Aquí hay un código de ejemplo completo que utiliza un subproceso y un controlador para obtener la respuesta del Geocoder sin bloquear la interfaz de usuario.

Procedimiento de llamada Geocoder, se puede ubicar en una clase de ayuda

 public static void getAddressFromLocation( final Location location, final Context context, final Handler handler) { Thread thread = new Thread() { @Override public void run() { Geocoder geocoder = new Geocoder(context, Locale.getDefault()); String result = null; try { List
list = geocoder.getFromLocation( location.getLatitude(), location.getLongitude(), 1); if (list != null && list.size() > 0) { Address address = list.get(0); // sending back first address line and locality result = address.getAddressLine(0) + ", " + address.getLocality(); } } catch (IOException e) { Log.e(TAG, "Impossible to connect to Geocoder", e); } finally { Message msg = Message.obtain(); msg.setTarget(handler); if (result != null) { msg.what = 1; Bundle bundle = new Bundle(); bundle.putString("address", result); msg.setData(bundle); } else msg.what = 0; msg.sendToTarget(); } } }; thread.start(); }

Aquí está la llamada a este procedimiento Geocoder en su Actividad de UI:

 getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler()); 

Y el controlador para mostrar los resultados en su UI:

 private class GeocoderHandler extends Handler { @Override public void handleMessage(Message message) { String result; switch (message.what) { case 1: Bundle bundle = message.getData(); result = bundle.getString("address"); break; default: result = null; } // replace by what you need to do myLabel.setText(result); } } 

No olvides poner el siguiente permiso en tu Manifest.xml

  

Parece que hay dos cosas sucediendo aquí.

1) Te has perdido la new palabra clave antes de llamar al constructor.

2) El parámetro que está pasando al constructor de Geocoder es incorrecto. Está pasando en una Locale donde está esperando un Context .

Hay dos constructores de Geocoder , los cuales requieren un Context y uno que también toma una Locale :

 Geocoder(Context context, Locale locale) Geocoder(Context context) 

Solución

Modifique su código para pasar en un Contexto válido e incluya lo new y debería estar listo para continuar.

 Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); List
myList = myLocation.getFromLocation(latPoint, lngPoint, 1);

Nota

Si sigues teniendo problemas, puede ser un problema de permisos. La geoencoding utiliza implícitamente Internet para realizar las búsquedas, por lo que su aplicación requerirá una etiqueta de permiso de uso de INTERNET en su manifiesto.

Agregue el siguiente nodo de permisos de uso dentro del nodo de manifiesto de su manifiesto.

  

La razón de esto es el inexistente Servicio de back-end:

La clase Geocoder requiere un servicio de back-end que no está incluido en el core android framework. Los métodos de consulta de Geocoder devolverán una lista vacía si no hay servicio de back-end en la plataforma.

Primero obtén Latitude y Longitude usando Location y LocationManager class. Ahora prueba el siguiente código para obtener la ciudad, información de la dirección

 double latitude = location.getLatitude(); double longitude = location.getLongitude(); Geocoder gc = new Geocoder(this, Locale.getDefault()); try { List
addresses = gc.getFromLocation(lat, lng, 1); StringBuilder sb = new StringBuilder(); if (addresses.size() > 0) { Address address = addresses.get(0); for (int i = 0; i < address.getMaxAddressLineIndex(); i++) sb.append(address.getAddressLine(i)).append("\n"); sb.append(address.getLocality()).append("\n"); sb.append(address.getPostalCode()).append("\n"); sb.append(address.getCountryName()); }

La información de la ciudad está ahora en sb. Ahora convierta el sb a String (usando sb.toString ()).

Bueno, todavía estoy perplejo. Así que aquí hay más código.

Antes de abandonar mi mapa, llamo a SaveLocation(myMapView,myMapController); Esto es lo que termina llamando mi información de geoencoding.

Pero como getFromLocation puede lanzar una IOException , tuve que hacer lo siguiente para llamar a SaveLocation

 try { SaveLocation(myMapView,myMapController); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Entonces tengo que cambiar SaveLocation diciendo que arroja IOExceptions:

  public void SaveLocation(MapView mv, MapController mc) throws IOException{ //I do this : Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault()); List myList = myLocation.getFromLocation(latPoint, lngPoint, 1); //... } 

Y se cuelga todo el tiempo.

He oído que Geocoder está del lado de los errores. Recientemente, armé una aplicación de ejemplo que usa el servicio de geoencoding http de Google para buscar la ubicación desde latitud / longitud. Siéntase libre de consultarlo aquí

http://www.smnirven.com/?p=39

Utilizar esta

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