¿Por qué Android Geocoder lanza una excepción de “Servicio no disponible”?

La aplicación usa el objeto Geocoder . Funciona bien en mi stock Froyo Nexus One. Pero luego ejecuto exactamente la misma aplicación en un dispositivo diferente (una tableta Advent Vega 10 “que también ejecuta Froyo) y obtengo esta excepción: Servicio no disponible . El método que estoy usando es getFromLocationName() , estoy construyendo contra el Android 1.6 Google API.

Soy consciente de un problema en el que se lanza esta excepción en el emulador, pero sospecho que esto es diferente. ¿Por qué se lanzaría en un dispositivo que ejecuta Froyo pero no en otro?

La aplicación es una aplicación de ubicación, y como la tableta no tiene GPS o red móvil, en un escenario donde la conexión Wi-Fi no proporciona una ubicación, el usuario debe especificarla manualmente, por lo que no podrá usar el objeto Geocoder son malas noticias.

Podría agregar una forma para que el usuario seleccione la ubicación en un mapa, pero no es ideal. Posiblemente podría usar la API de Google Maps directamente, pero estoy ansioso por comprender la naturaleza del problema primero, ya que sería bueno tener una solución más fácil.

Afortunadamente, en una futura versión, Android incluirá una “ubicación predeterminada” del nivel del sistema operativo para dispositivos que no sean Geocoder, por lo que las aplicaciones que reconocen la ubicación funcionan de forma automática en dispositivos como Google TV.

Le pedí a Reto Meier de Google que confirmara que mi teoría era correcta y me dijo “Correcto. El Geocoder es parte del complemento API de Google que no es parte de AOSP”.

Por lo tanto, cualquier dispositivo que no venga con Play Store, aplicaciones de GMail, etc. también perderá el back-end de Geocoder.

Parece haber otra solución posible para este problema , que desafortunadamente se marca como una pregunta duplicada y, por lo tanto, se puede perder. Esencialmente, un reinicio del dispositivo aclara el problema. Tenga en cuenta que lo llamé una “solución alternativa” y no una “solución”. 🙁

Algunos dispositivos no tienen soporte para Geocoder, por lo que lo que debes hacer es crear tu propio geocodificador.

Básicamente necesita crear una tarea asíncrona para solicitar a google la dirección y tratar la respuesta json.

Usando aquery, hago algo como esto:

 public void asyncJson(String address){ address = address.replace(" ", "+"); String url = "http://maps.googleapis.com/maps/api/geocode/json?address="+ address +"&sensor=true"; aq.ajax(url, JSONObject.class, new AjaxCallback() { @Override public void callback(String url, JSONObject json, AjaxStatus status) { if(json != null){ //here you work with the response json JSONArray results = json.getJSONArray("results"); Toast.makeText(context, results.getJSONObject(1).getString("formatted_address")); }else{ //ajax error, show error code Toast.makeText(aq.getContext(), "Error:" + status.getCode(), Toast.LENGTH_LONG).show(); } } }); } 

Para aquellos que buscan alternativas, con suerte, mi respuesta en otra publicación es útil. Puede usar la API de geoencoding de Google cuando se detecte un error en la encoding geográfica .

Para obtener más código => Obtener la ubicación actual usando json

Después de perder varias horas, obtuve la solución más simple.

Acabo de reiniciar mi dispositivo, y comenzó a funcionar.

Parece que el problema se debe a algún problema de almacenamiento en caché del nivel del sistema operativo. Espero que también funcione para tu …

Tuve el mismo problema. Usé la siguiente función.

Nota:

Usa el context de tu actividad y no uses getApplicationContext() para la siguiente función

 public static Address getLocalityFrmGeoCoder(Context context, Location mLocation) { try { if(mLocation!=null){ Geocoder gCoder = new Geocoder(context, Locale.getDefault()); List
address = gCoder.getFromLocation(mLocation.getLatitude(), mLocation.getLongitude(), 1); if (address.size() > 0) { return address.get(0); } } } catch (Exception e) { Log.d("GEOCODER", "GEOCODER EXCEPTION"); e.printStackTrace(); } return null; }