latitude - Android: geocodificación inversa-getFromLocation
geocoder android ejemplo (8)
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;
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<Address> 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
<uses-permission android:name="android.permission.INTERNET" />
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 geocodificación.
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.
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<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
He oído que Geocoder está del lado de los errores. Recientemente, armé una aplicación de ejemplo que usa el servicio de geocodificación http de Google para buscar la ubicación desde latitud / longitud. Siéntase libre de consultarlo aquí
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.
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<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
Nota
Si sigues teniendo problemas, puede ser un problema de permisos. La geocodificación 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.
<uses-permission android:name="android.permission.INTERNET" />
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<Address> 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 ()).
Utilizar esta
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);