android - longitude - google geocode limit
¿Por qué Android Geocoder lanza una excepción de "Servicio no disponible"? (6)
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.
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<JSONObject>() {
@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();
}
}
});
}
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 ...
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.
Para aquellos que buscan alternativas, con suerte, mi respuesta en otra publicación es útil. Puede usar la API de geocodificación de Google cuando se detecte un error en la codificación geográfica .
Para obtener más código => Obtener la ubicación actual usando json
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". :(
Tuve el mismo problema. Usé la siguiente función.
Nota:
Usa el
context
de tu actividad y no usesgetApplicationContext()
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> 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;
}