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)
- GPS de seguimiento de Android y WakeLock
- Cómo habilitar GPS en Eclipse Emulator para Android
- Android Location.getAccuracy () devuelve 1
- Location.getTime () devuelve siempre timestamp sin milisegundos
- ¿Necesito solicitar actualizaciones de ubicación al utilizar Geofences de ubicación fusionada?
{
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)
- ¿Cómo obtener la dirección de la cámara del teléfono habilitado para GPS?
- Desactivar el GPS mediante programación cuando salgo de mi programa
- Comprueba si está habilitado 'Acceso a mi ubicación' - Android
- No hay actualizaciones de ubicación GPS en el Galaxy S3
- Android: LocationManager vs Servicios de Google Play
- Tiempo de espera de Android GPS
- Sigo obteniendo una ubicación incorrecta en Android
- ¿Cómo obtener la ubicación actual de GPS (latitud-longitud) con la API de Google en la aplicación de Android?
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 burlar una SharedPreferences usando Mockito
- AnimatedVectorDrawable en la biblioteca de soporte y animación de "pathData"