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); } }; 
  • Cómo obtener un Broadcastreceiver fiable
  • Uso de Google Analytics en una aplicación de Android con una actividad de interfaz de usuario y un servicio de fondo sin fin
  • ¿Cómo comprobar si un servicio ya se está ejecutando o no en android?
  • REST / JSON / XML-RPC / SOAP
  • "Service MeasurementBrokerService está en uso" está mostrando en mi proceso de solicitud
  • Android Speech Reconocimiento de voz: Llamada repetida de SpeechRecognizer.startListening () falla en JB 4.1.2
  • ¿Dónde debo usar Servicio, AsyncTask y Broadcast Receiver?
  • Android Service Exchange siempre se bloquea
  • ¿Puedo iniciar un servicio sin actividad o receptor?
  • Android: mantener vivo un servicio de fondo (prevenir la muerte del proceso)
  • StopSelf no detiene mi servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.