Poner un marker en google maps usando solo la dirección

275 views
Skip to first unread message

fernandosg

unread,
May 14, 2012, 8:42:47 PM5/14/12
to AndroidStartup
Hola a todos.
Bueno hace tiempo que vengo usando la api de google maps, pero con
javascript; en versiones anteriores hice un script para googlemaps ,
usando un método para insertar una marca en google maps(ya venia en la
api), ahorita no se si sea por la versión 3 de la API o que el método
que yo ocupaba ya no funciona, pero ahora es necesario la latitud y
longitud para insertar una marca.

Quería saber si alguno sabe ¿como poner una marca en google maps
usando solo la dirección?, o si ya con esta version no se puede
insertar, solamente usando la latitud y longitud.

Javier Hdez Deniz

unread,
May 14, 2012, 11:34:04 PM5/14/12
to android...@googlegroups.com

Fernando Segura Gòmez

unread,
May 15, 2012, 3:17:03 AM5/15/12
to android...@googlegroups.com
Gracias por el dato, ya cheque el codigo e hice una pequeña prueba.
Mi codigo java es este basicamente :

String address=String.valueOf(checarinput.getText());
Geocoder geoCoder = new Geocoder(myactivity.this, Locale.getDefault());   
arreglodirecciones.add(address);
List<Address> test= null;
try {
test = geoCoder.getFromLocationName(arreglodirecciones.get(0), 5);
checarinput.setText((int) test.get(0).getLatitude());
//System.out.println(test.get(0).getLatitude());
//System.out.println(test.get(0).getLongitude());
} catch (IOException e) {
// TODO Auto-generated catch block
checarinput.setText("No se pudo");
e.printStackTrace();
}

Basicamente lo puse dentro de otro metodo, cuando hago clic en un boton , me permite en un edittext escribir la direccion, y la añado a una lista, para esta pasarla como parametro de geoCoder.
Cuando lo hago en el emulador, gracias al try catch, me aparece esto

Service not available at android.location.geocoder.getfromlocationname

Segun mencionan algunos que es un bug del emulador ( http://code.google.com/p/android/issues/detail?id=8816) , al pensar que es solo el emulador, lo paso a mi celular(un android 2.2), y se traba.
¿Que es lo que pasa?

2012/5/14 Javier Hdez Deniz <droi...@gmail.com>

Fernando F. Gallego

unread,
May 15, 2012, 4:34:32 AM5/15/12
to android...@googlegroups.com
El método getFromLocationName hace una petición web y debe hacerse en otro hilo o te bloqueará la interfaz hasta que devuelva un valor. También debes tener activado el permiso de Internet y tener conexión.

Es posible que la lista que te devuelva esté vacía porque no encuentra ningún lugar relacionado, entonces  "test.get(0)" te dará una excepción

2012/5/15 Fernando Segura Gòmez <angel...@gmail.com>

Fernando Segura Gòmez

unread,
May 15, 2012, 11:07:06 AM5/15/12
to android...@googlegroups.com

Hola antes te agradezco tu respuesta. Sobre lo que me mencionas sobre crear un hilo,¿necesitaria sincronizarlo? Es mucho pedir pero pudieras hacerme un ejemplo de como implementarlo en hilos? Ya lo hice pero no me funciono.
La aplicacion tiene acceso a internet no creo que sea eso,sobre las direcciones que no encuentre tampoco creo,ya que solo puse el nombre de la ciudad y el estado(de mexico) y en google maps me es funcional,no se si el modo de poner direcciones haya cambiado,si tienes alguna direccion que te haya funcionado dime cual es a lo mejor esta fallando eso.
Muchas gracias por todo,saludos.

Fernando F. Gallego

unread,
May 15, 2012, 12:22:33 PM5/15/12
to android...@googlegroups.com
Busca información sobre los AsyncTask que vienen muy bien para esto, simplemente creas una clase que extiende la clase AsyncTask y en el método onBackground haces la consulta y el resultado al devolverlo lo recibes en un método que se llama onPostExecute, ahí es donde puedes mostrarlo por pantalla.

De todos modos no sé si será este el problema.

Un saludo.

Javier Hdez

unread,
May 15, 2012, 1:53:47 PM5/15/12
to android...@googlegroups.com
Creo que no es por el UI Thread.

Al parecer no hay soporte para geocodes en froyo y gingerbread lo que he visto son workarounds sobre eso, en el link de arriba casi al final hay uno, pero es para Geocoding Reverse lo contrario a lo que necesita, pero le daría una hojeada a ver si funciona sin el Reverse, no sé es una idea.

Javier Hdez

unread,
May 15, 2012, 1:54:54 PM5/15/12
to android...@googlegroups.com
Otra, que quizás no te interese es utilizar la API level 14, que ahí no hay problema.

Fernando F. Gallego

unread,
May 15, 2012, 2:39:54 PM5/15/12
to android...@googlegroups.com
En teoría el bug es sobre el emulador, debería funcionar en el teléfono. Ayer mismo hice algo similar y funciona bien en mi 2.3.3. Puede que en sudarmérica no funcione el servicio de geocoding de google.

Fernando Segura Gòmez

unread,
May 15, 2012, 7:06:54 PM5/15/12
to android...@googlegroups.com

Muchisimas gracias por sus respuestas,si sabia que era un bug pero tenia la esperanza de que fuera error de codigo o mio. Una pregunta como puedo cambiar el lv api a 14 y utilizarlo en android 2.2? Sabia que el lv api dependia de a que plataforma se usa

Fernando Segura Gòmez

unread,
May 15, 2012, 10:00:37 PM5/15/12
to android...@googlegroups.com
Ya cambie el lv api inclusive al 15(4.0), pero aun no me funciona, no he actualizado Android a 2.3 ya que quiero probarlo por ahora a 2.2 y ver si me funciona, ya que segun estadisticas es la version mas usada en los moviles android.

Buscando una respuesta, he encontrado una manera, usando json para traer los resultados en xml por la web de google.
Esta solucion que me he encontrado consta de dos metodos, una para generar un JSONObject y la otra para obtener la latitud y longitud:

public static JSONObject getLocationInfo(String address) {

HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?address=" + address+ "ka&sensor=false");
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();

try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int b;
while ((b = stream.read()) != -1) {
stringBuilder.append((char) b);
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}

JSONObject jsonObject = new JSONObject();
try {
jsonObject = new JSONObject(stringBuilder.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return jsonObject;
}


Y esta la que saca la lat y long:

public static GeoPoint getGeoPoint(JSONObject jsonObject) {

		Double lon = new Double(0);
		Double lat = new Double(0);

		try {

			lon = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
				.getJSONObject("geometry").getJSONObject("location")
				.getDouble("lng");

			lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
				.getJSONObject("geometry").getJSONObject("location")
				.getDouble("lat");

		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6));

	}

El primer metodo esta bien, pero el segundo tengo un problema, en esta linea:

lon = ((JSONArray)jsonObject.get....

Y la siguiente tambien, el error que obtengo es el siguiente:
- JSONArray cannot be resolved 
to a type

A lo que entiendo es que es una especie de cast, pero no se si este mal JSONArray, ya que he intentado buscar si falta algo que importar, pero inclusive eclipse no me da sugerencia de cual hacerlo.
Me sali un poco del tema original, pero lo pongo aca para que si lleguen a buscar en google, tambien puedan encontrar la solucion.
Muchisimas gracias por el apoyo.
Saludos

Fernando F. Gallego

unread,
May 16, 2012, 2:57:33 AM5/16/12
to android...@googlegroups.com
Si te fijas, estás haciendo cast a JSONArray de un double:

lon = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
				.getJSONObject("geometry").getJSONObject("location")
				.getDouble("lng");

El 16 de mayo de 2012 04:00, Fernando Segura Gòmez <angel...@gmail.com> escribió:
lon = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
				.getJSONObject("geometry").getJSONObject("location")
				.getDouble("lng");



Fernando Segura Gòmez

unread,
May 16, 2012, 4:14:13 AM5/16/12
to android...@googlegroups.com
Hola , antes agradecerte la respuesta.
Ya lo resolvi, me faltaba importar algo extra, solo que eclipse no me daba la sugerencia(me he hecho dependiente del entorno =s).
Lo que faltaba importar era:
import org.json.JSONArray;

Muchas gracias por todo, seguire leyendo sobre geocoder, ya que varios que opinaban sobre parsear la url , decian que no era muy recomendable(no se si tenga que ver con cuestion de rendimiento).
Saludos a todos.

2012/5/16 Fernando F. Gallego <ferd...@gmail.com>
Reply all
Reply to author
Forward
0 new messages