El servicio de Google Geocoder no es viable (Coordenadas a la dirección)

Tengo que conseguir una dirección por coordenadas, pero doesnt trabajo y salidas "Couldnt consigue la dirección":

public String GetAddress(String lat, String lon) { Geocoder geocoder = new Geocoder(this, Locale.ENGLISH); String ret = ""; try { List<Address> addresses = geocoder.getFromLocation(Double.parseDouble(lat), Double.parseDouble(lon), 1); if(addresses != null) { Address returnedAddress = addresses.get(0); StringBuilder strReturnedAddress = new StringBuilder(""); for(int i=0; i<returnedAddress.getMaxAddressLineIndex(); i++) { strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n"); } ret = strReturnedAddress.toString(); ret=ret.substring(0, ret.length() - 1); } else{ ret = "Unknown Address"; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); ret = "Couldn't get Address"; } return ret; } 

LogCat:

 09-27 23:47:49.837: W/System.err(1862): java.io.IOException: Service not Available 09-27 23:47:49.847: W/System.err(1862): at android.location.Geocoder.getFromLocation(Geocoder.java:136) 09-27 23:47:49.847: W/System.err(1862): at com.example.free.Add.GetAddress(Add.java:634) 09-27 23:47:49.857: W/System.err(1862): at com.example.free.Add$LoadAddress.doInBackground(Add.java:608) 09-27 23:47:49.857: W/System.err(1862): at com.example.free.Add$LoadAddress.doInBackground(Add.java:1) 09-27 23:47:49.857: W/System.err(1862): at android.os.AsyncTask$2.call(AsyncTask.java:287) 09-27 23:47:49.857: W/System.err(1862): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 09-27 23:47:49.857: W/System.err(1862): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 09-27 23:47:49.857: W/System.err(1862): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 09-27 23:47:49.857: W/System.err(1862): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 09-27 23:47:49.857: W/System.err(1862): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 09-27 23:47:49.857: W/System.err(1862): at java.lang.Thread.run(Thread.java:856) 

La respuesta común a este problema es que tienes que reiniciar el dispositivo.

Seguramente no puede decirle a sus usuarios que reinicien el dispositivo para que funcione su aplicación, así que mi solución fue usar un fallback HTTP, aquí está el AsyncTask que uso en mi código.

Tendrá que modificarlo para su situación, ya que la dirección de búsqueda de la posición y no al revés.

  private class GetAddressPositionTask extends AsyncTask<String, Integer, LatLng> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected LatLng doInBackground(String... plookupString) { String lookupString = plookupString[0]; final String lookupStringUriencoded = Uri.encode(lookupString); LatLng position = null; // best effort zoom try { if (geocoder != null) { List<Address> addresses = geocoder.getFromLocationName( lookupString, 1); if (addresses != null && !addresses.isEmpty()) { Address first_address = addresses.get(0); position = new LatLng(first_address.getLatitude(), first_address.getLongitude()); } } else { Log.e(TAG, "geocoder was null, is the module loaded? " + isLoaded); } } catch (IOException e) { Log.e(TAG, "geocoder failed, moving on to HTTP"); } // try HTTP lookup to the maps API if (position == null) { HttpGet httpGet = new HttpGet( "http://maps.google.com/maps/api/geocode/json?address=" + lookupStringUriencoded + "&sensor=true"); 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 { // Log.d("MAPSAPI", stringBuilder.toString()); jsonObject = new JSONObject(stringBuilder.toString()); if (jsonObject.getString("status").equals("OK")) { jsonObject = jsonObject.getJSONArray("results") .getJSONObject(0); jsonObject = jsonObject.getJSONObject("geometry"); jsonObject = jsonObject.getJSONObject("location"); String lat = jsonObject.getString("lat"); String lng = jsonObject.getString("lng"); // Log.d("MAPSAPI", "latlng " + lat + ", " // + lng); position = new LatLng(Double.valueOf(lat), Double.valueOf(lng)); } } catch (JSONException e) { Log.e(TAG, e.getMessage(), e); } } return position; } @Override protected void onPostExecute(LatLng result) { Log.i("GEOCODE", result.toString()); super.onPostExecute(result); } }; 
  • ¿Es mala práctica usar múltiples servicios de fondo en una sola aplicación para Android?
  • Android mejor manera de obtener la ubicación repetidamente en el fondo considerando la batería así
  • El servicio onCreate de Android se llama varias veces sin llamar a onDestroy
  • La mejor manera de enviar actualizaciones de ubicación de usuario al servidor en segundo plano (Android)
  • Activación de la pantalla desde el receptor / servicio
  • Problemas con SharedPreferences en un servicio (getPreferences no existe en un servicio)
  • Definición de la política de SELinux para el servicio del sistema Android: cómo configurar?
  • Análisis de fondo wifi en Android
  • Cómo obtener detalles del proceso de ejecución de fondo android
  • Android AlarmManager a veces tarde
  • Android: crea servicio que se ejecuta cuando se detiene la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.