Hacer un buscador de mapas para Android.

Ten en cuenta que necesitarás una API key de Google Maps para desarrollo, y que siempre es recomendable tenerla guardada en un archivo strings.xml por ejemplo, y no en la misma actividad. La clase Geocoder es la que se encarga de convertir la cadena de texto con la direción al formato de coordenadas para el Mapview.

Yo sólo soy un principiante con estos temas, aunque mi ejemplo funciona tengo que recomendar la serie de articulos A simple example using Google Maps Android API v2de Android-er, él sabe mucho más que yo del tema en general y tiene mucha más información sobre el uso de Mapas en Android.

Primero, el layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">

	<LinearLayout
		android:layout_width="match_parent"
		android:layout_height="wrap_content" >

		<EditText
			android:id="@+id/editText1"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:ems="10"
			android:maxLines="1" />

		<Button
			android:id="@+id/button1"
			style="?android:attr/buttonStyleSmall"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:text="Buscar" />

	</LinearLayout>

	<com.google.android.maps.MapView
		android:id="@+id/mapa"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:apiKey="000000000000000000000000000000000000000"
		android:clickable="true" />

</LinearLayout>

Ahora el código Java

package ejercicio.ejercicio;

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

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class Main extends MapActivity {
	private MapView mapa;
	private MapController controlMapa;
	private Button boton;
	private EditText input;
	private String direccion;
	private List <Address> address;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		mapa = (MapView)findViewById(R.id.mapa);
		controlMapa = mapa.getController();
		input = (EditText)findViewById(R.id.editText1);
		boton = (Button)findViewById(R.id.button1);
		
		
		
		mapa.setBuiltInZoomControls(true);
		
		boton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
			
			direccion = input.getText().toString();
			
			if(direccion.equals("")){
				toast("No hay dirección para buscar : (");
			}else{
				toast("Buscando \""+direccion+"\"");
				Geocoder coder = new Geocoder(getApplicationContext());
				
				try {
					address = coder.getFromLocationName(direccion, 1);	
					Address location = address.get(0);	
					int lat = (int) (location.getLatitude()*1E6);
					int lon = (int) (location.getLongitude()*1E6);
					GeoPoint loc = new GeoPoint(lat,lon);
					controlMapa.setCenter(loc);
					controlMapa.setZoom(14);
				} catch (IOException e) {
					toast("No se ha encontrado la dirección : (");
				}
			}
		
			// Ocultar el teclado
			InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
				imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
			}
		});
	}
	
	@Override
	protected boolean isRouteDisplayed(){
		return false;
	}
	
	public void toast(String mensaje){
		Toast.makeText(getApplicationContext(), mensaje, 1000).show();
	}
}



Josep Viciana

Programador de 27 años con una década de experiencia como programador. interesado en el diseño, ilustración y nuevas tecnologías. Dedicado desde siempre a la programación Web y desde hace algunos años también a la móvil.

12 comentarios

En el manifest necesitarás poner los permisos para internet y para la localización.

uses-permission android:name="android.permission.INTERNET"
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"

etc…

Gracias por contestar. Supongo que las librerías son las clásicas de google, pero me casca al iniciar la actividad. Mi móvil es un 2.3, supongo que con la librería v4 debería valer, no?

Siento ser tan pesado, pero ya que estás por aquí aprovecho 🙂

Después de meter los permisos, incluso alguno más que he encontrado por ahí, la última parte de código y mi propia API, se sigue viendo cuadriculado. Crees que me falta algo?

Muchas gracias por la ayuda.

Pues si no hay errores en la consola y no se cargan las capas del mapa. Yo creo que tiene que ser un tema de la api key.

Esta tarde si me acuerdo subo una prueba de app que hice hace un tiempo (Mis Lugares) a GitHub para que puedas ver lo relacionado con los mapas.

Ojo con el tema de las claves para debug y para publicar.

Salud.

Ya he leido algo sobre las claves para debug y publicar, pero se supone que eso afecta al exportar, no cuando usas el móvil en lugar del emulador. Gracias y perdona las molestias.

Hola Josep, igual estás muy liado o igual te has olvidado de mí! Si no encuentras solución dímelo, que ya bastante te has molestado.

Me podrias ayudar, ya tengo la codificacion pero no me muestra nada, en cualquier direccion que escriba, siempre me dice que no se encuentra
GRACIAS

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *