El servicio Google Geocoder no es válido (Coordenadas a la dirección)

Tengo que obtener una dirección por coordenadas, pero no funciona y muestra “No se pudo obtener la dirección”:

public String GetAddress(String lat, String lon) { Geocoder geocoder = new Geocoder(this, Locale.ENGLISH); String ret = ""; try { List
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 debe reiniciar su dispositivo.

Seguramente no puede decirle a sus usuarios que reinicien el dispositivo para que su aplicación funcione, por lo que mi solución fue utilizar un HTTP de respaldo, aquí está la AsyncTask que uso en mi código.

Tendrás que modificarlo para tu situación, ya que busco la dirección desde la posición y no al revés.

  private class GetAddressPositionTask extends AsyncTask { @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
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); } };