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:
- ¿Comunicación Bluetooth en hilo o servicio en Android?
- Iniciar el servicio en el inicio y después de que se haya instalado la aplicación
- ¿Cómo mantener una aplicación Android funcionando indefinidamente?
- Android: No se pudo importar la clase java.util.ArrayList en el archivo aidl
- Servicio Android-Comunicación de 2 vías
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)
- Reconocimiento de voz como servicio de fondo
- ¿Por qué obtengo una InstantiationException si intento iniciar un servicio?
- No se puede iniciar el servicio Intent {cmp = com.marie.mainactivity / .BackgroundService}: no encontrado
- Using android: process = ": remote" recrea el objeto de aplicación android
- ¿Cómo detectar cuándo el usuario inicia otra aplicación? (Androide)
- Compruebe si el servicio se está ejecutando desde un receptor de difusión
- Las preferencias compartidas a veces se eliminan
- ¿Es mala práctica usar múltiples servicios de fondo en una sola aplicación para Android?
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); } };
- Java No se puede crear el controlador dentro del subproceso que no ha llamado Looper.prepare ()
- crear CustomInfoWindow en google map v2