Servicio no disponible en geoCoder

Puedo conseguir la longitud y la latitud pero conseguir la dirección conseguí un error.

Public boolean onTouchEvent (evento MotionEvent, MapView mapView)

{

if(event.getAction()==0) { GeoPoint p = mapView.getProjection().fromPixels( (int) event.getX(), (int) event.getY()); Geocoder geoCoder=new Geocoder(getBaseContext(),Locale.getDefault()); try { List<Address> address = geoCoder.getFromLocation( p.getLatitudeE6() / 1E6, p.getLongitudeE6() / 1E6, 1); String add=""; if(address.size()>0) { for (int i=0; i<address.get(0).getMaxAddressLineIndex();i++) add += address.get(0).getAddressLine(i) + "\n"; } Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } return true; } return false; 

}

Mi Logcat ->

 02-14 12:27:35.717: WARN/System.err(452): java.io.IOException: Service not Available 02-14 12:27:35.727: WARN/System.err(452): at android.location.Geocoder.getFromLocation(Geocoder.java:117) 02-14 12:27:35.727: WARN/System.err(452): at com.parkhya.SecondGps.MainActivity$MapOverlay.onTouchEvent(MainActivity.java:47) 02-14 12:27:35.745: WARN/System.err(452): at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63) 02-14 12:27:35.745: WARN/System.err(452): at com.google.android.maps.MapView.onTouchEvent(MapView.java:643) 02-14 12:27:35.757: WARN/System.err(452): at android.view.View.dispatchTouchEvent(View.java:3766) 02-14 12:27:35.757: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897) 02-14 12:27:35.757: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 02-14 12:27:35.767: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 02-14 12:27:35.767: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 02-14 12:27:35.777: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 02-14 12:27:35.777: WARN/System.err(452): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 02-14 12:27:35.777: WARN/System.err(452): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 02-14 12:27:35.777: WARN/System.err(452): at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 02-14 12:27:35.786: WARN/System.err(452): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 02-14 12:27:35.786: WARN/System.err(452): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 02-14 12:27:35.796: WARN/System.err(452): at android.os.Handler.dispatchMessage(Handler.java:99) 02-14 12:27:35.796: WARN/System.err(452): at android.os.Looper.loop(Looper.java:123) 02-14 12:27:35.796: WARN/System.err(452): at android.app.ActivityThread.main(ActivityThread.java:4627) 02-14 12:27:35.806: WARN/System.err(452): at java.lang.reflect.Method.invokeNative(Native Method) 02-14 12:27:35.816: WARN/System.err(452): at java.lang.reflect.Method.invoke(Method.java:521) 02-14 12:27:35.816: WARN/System.err(452): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 02-14 12:27:35.825: WARN/System.err(452): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02-14 12:27:35.837: WARN/System.err(452): at dalvik.system.NativeStart.main(Native Method) 

Aquí está mi manera de obtener la dirección, incluso si Geocoder falló … pero primero permítanme explicar mi propia experiencia con Geocoder:

Por alguna razón desconocida, Geocoder funciona bien entonces, de repente romper! .

Lo que observé es que, después de un tiempo ( puede ser días ), Geocoder empezar a lanzar "Servicio no disponible" excepción.

EDIT -> Como se menciona por Christian , la excepción se lanza incluso isPresent () devuelve true. <- EDIT END

Realmente raro ya que estaba funcionando bien antes y no hubo cambios de configuración:

  • Mismo dispositivo
  • Misma versión de Android
  • Misma aplicación
  • Mismo manifiesto
  • WIFI activo y en funcionamiento, la función de ubicación del dispositivo está habilitada en la configuración

Por supuesto, algo cambió, pero, por el momento, no sabemos exactamente qué. Se ha abierto un error al respecto: Problema 38009: 4.1.1 Excepción de lanzamiento de geocodificador: IOException: Servicio no disponible

Último mensaje en este hilo (ATTOW) "Probablemente es reproducible periódicamente en android 4.0.x + target API x"

Como solución , puede utilizar Google Map

Aquí está mi clase de GeocoderHelper que proporciona un Plan B de "Google Map" en caso de que Geocoder comience a fallar. En mi caso, estoy interesado solamente en CityName, pero usted puede conseguir básicamente cualquier availalbe de los datos en salida de JSON del mapa de google

Uso:

Nuevo GeocoderHelper (). FetchCityName (contexto, ubicación); A continuación, hacer algo en onPostExecute () de código de ejemplo (enviar difusión, invocar el método de escucha, establecer un textView texto, lo que sea)

GeocoderHelper Clase:

 package com.<your_package>.location; import java.util.List; import java.util.Locale; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicResponseHandler; import org.json.JSONArray; import org.json.JSONObject; import android.content.Context; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.net.http.AndroidHttpClient; import android.os.AsyncTask; import android.util.Log; public class GeocoderHelper { private static final AndroidHttpClient ANDROID_HTTP_CLIENT = AndroidHttpClient.newInstance(GeocoderHelper.class.getName()); private boolean running = false; public void fetchCityName(final Context contex, final Location location) { if (running) return; new AsyncTask<Void, Void, String>() { protected void onPreExecute() { running = true; }; @Override protected String doInBackground(Void... params) { String cityName = null; if (Geocoder.isPresent()) { try { Geocoder geocoder = new Geocoder(contex, Locale.getDefault()); List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); if (addresses.size() > 0) { cityName = addresses.get(0).getLocality(); } } catch (Exception ignored) { // after a while, Geocoder start to trhow "Service not availalbe" exception. really weird since it was working before (same device, same Android version etc.. } } if (cityName != null) // ie, Geocoder succeed { return cityName; } else // ie, Geocoder failed { return fetchCityNameUsingGoogleMap(); } } // Geocoder failed :-( // Our B Plan : Google Map private String fetchCityNameUsingGoogleMap() { String googleMapUrl = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + location.getLatitude() + "," + location.getLongitude() + "&sensor=false&language=fr"; try { JSONObject googleMapResponse = new JSONObject(ANDROID_HTTP_CLIENT.execute(new HttpGet(googleMapUrl), new BasicResponseHandler())); // many nested loops.. not great -> use expression instead // loop among all results JSONArray results = (JSONArray) googleMapResponse.get("results"); for (int i = 0; i < results.length(); i++) { // loop among all addresses within this result JSONObject result = results.getJSONObject(i); if (result.has("address_components")) { JSONArray addressComponents = result.getJSONArray("address_components"); // loop among all address component to find a 'locality' or 'sublocality' for (int j = 0; j < addressComponents.length(); j++) { JSONObject addressComponent = addressComponents.getJSONObject(j); if (result.has("types")) { JSONArray types = addressComponent.getJSONArray("types"); // search for locality and sublocality String cityName = null; for (int k = 0; k < types.length(); k++) { if ("locality".equals(types.getString(k)) && cityName == null) { if (addressComponent.has("long_name")) { cityName = addressComponent.getString("long_name"); } else if (addressComponent.has("short_name")) { cityName = addressComponent.getString("short_name"); } } if ("sublocality".equals(types.getString(k))) { if (addressComponent.has("long_name")) { cityName = addressComponent.getString("long_name"); } else if (addressComponent.has("short_name")) { cityName = addressComponent.getString("short_name"); } } } if (cityName != null) { return cityName; } } } } } } catch (Exception ignored) { ignored.printStackTrace(); } return null; } protected void onPostExecute(String cityName) { running = false; if (cityName != null) { // Do something with cityName Log.i("GeocoderHelper", cityName); } }; }.execute(); } } 

Espero que esto ayude.

El servicio de GeoCoder puede / no puede ser implementado ya que no es parte del framework core android. Consulte la documentación de GeoCoder aquí

Necesita usar las API de Google y analizar la dirección de la respuesta de json para que funcione en todos los dispositivos.

Una clase para manejar geocodificación y geocodificación inversa. Geocodificación es el proceso de transformar una dirección de calle u otra descripción de una ubicación en una coordenada (latitud, longitud). Geocodificación inversa es el proceso de transformar una coordenada (latitud, longitud) en una dirección (parcial). La cantidad de detalle en una descripción de ubicación geocodificada inversa puede variar, por ejemplo, uno puede contener la dirección completa del edificio más cercano, mientras que otro puede contener sólo un nombre de ciudad y un código postal. La clase Geocoder requiere un servicio backend que no está incluido en el framework core android. Los métodos de consulta de Geocoder devolverán una lista vacía si no hay servicio de back-end en la plataforma. Utilice el método isPresent () para determinar si existe una implementación de Geocoder.

El problema es que NetworkLocationService ya no se esté ejecutando.

Sólo puede resolverse mediante un reinicio. (El NetworkLocationService se carga al arrancar)

  • Cómo obtener la ubicación GPS actual en Android
  • A-GPS, restablecimiento de GPS y sendExtraCommand
  • Lista de ordenación de los puntos lon \ lat, comience con los puntos más cercanos
  • ¿Cómo puedo obtener el nombre de la ciudad actual en android?
  • Conmutación entre proveedor de red y GPS
  • Cómo comprobar si las coordenadas de una ubicación caen a otra ubicación coordenadas de radio en android
  • Por qué getSpeed ​​() siempre devuelve 0 en android
  • Mejorar la precisión del GPS Android
  • ¿Por qué el servicio de aplicaciones se reinicia y no puede reiniciarlo?
  • Obtener la ubicación de Android a través de wifi no funciona
  • Android es la lista negra de nuestra ubicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.