Geocoder.getFromLocation arroja IOException en el emulador de Android

Usando Android emulator 2.2 api 8 sigo recibiendo IOException

03-05 19:42:11.073: DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol 03-05 19:42:15.505: WARN/System.err(1823): java.io.IOException: Service not Available 

Ese es mi código:

 private LocationManager manager = null; LocationListener locationListener = null; double latitude = 0; double longtitude = 0; List
myList = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // httpTranslateGet(); try { manager = (LocationManager) this .getSystemService(Context.LOCATION_SERVICE); initLocationListener(); manager.requestLocationUpdates(manager.GPS_PROVIDER, 0, 0, locationListener); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void initLocationListener() { locationListener = new LocationListener() { @Override public void onLocationChanged(android.location.Location location) { if (location != null) { latitude = location.getLatitude(); longtitude = location.getLongitude(); try { Geocoder geocoder = new Geocoder(WeatherCastDemo.this, Locale.getDefault()); List
addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); myList = geocoder.getFromLocation( location.getLatitude(), location.getLongitude(), 10); StringBuilder sb = new StringBuilder(); if (myList.size() > 0) { Address address = myList.get(0); for (int i = 0; i < address .getMaxAddressLineIndex(); i++) sb.append(address.getAddressLine(i)).append( "\n"); sb.append(address.getLocality()).append("\n"); sb.append(address.getPostalCode()).append("\n"); sb.append(address.getCountryName()); } } catch (IOException e) { e.printStackTrace(); } } } @Override public void onProviderDisabled(String arg0) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } }; }

Alguien tiene alguna idea?

He logrado hacerlo con Emulator 2.1 api 7, pero luego la geoencoding inversa siempre da un resultado vacío. ¿alguien podría confirmar mi código?

Gracias.

gracias, Ray

Este es un problema conocido con el Emulador. Funciona bien en un dispositivo real

En 2.2 API 8 recibirás la siguiente stacktrace

 java.io.IOException: Service not Available at android.location.Geocoder.getFromLocation(Geocoder.java:117) 

Consulte aquí para obtener más información (y una posible solución) consulte la siguiente URL:

http://code.google.com/p/android/issues/detail?id=8816

Si tiene problemas al utilizar GeoCoder en API inferiores, debe verificar stacktrace. De vez en cuando estoy teniendo lo siguiente:

 java.io.IOException: Unable to parse response from server at android.location.Geocoder.getFromLocation(Geocoder.java:124) 

Esto puede ser cualquier cosa, desde un problema del lado del servidor en Google, o un problema en el cliente (conexión a Internet).

Si el GeoCoder devuelve una lista vacía, debe verificar si tiene una implementación de GeoCoder adecuada disponible en el dispositivo (emulador o teléfono real).

Esto se puede hacer utilizando el método isPresent () en el objeto Geocoder.

http://developer.android.com/reference/android/location/Geocoder.html

Además, cuando se ejecuta en un emulador, asegúrese de que su imagen AVD esté configurada con las API de Google.

Puede usar Google Place API de la siguiente manera

cree un método que devuelva un JSONObject con la respuesta de la llamada HTTP como sigue

 public static JSONObject getLocationInfo(String address) { StringBuilder stringBuilder = new StringBuilder(); try { address = address.replaceAll(" ","%20"); HttpPost httppost = new HttpPost("http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false"); HttpClient client = new DefaultHttpClient(); HttpResponse response; stringBuilder = new StringBuilder(); response = client.execute(httppost); 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 { jsonObject = new JSONObject(stringBuilder.toString()); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return jsonObject; } 

ahora pasa ese JSONObject al método getLatLong () como sigue

 public static GeoPoint getLatLong(JSONObject jsonObject) { Double lon = new Double(0); Double lat = new Double(0); try { lon = ((JSONArray)jsonObject.get("results")).getJSONObject(0) .getJSONObject("geometry").getJSONObject("location") .getDouble("lng"); lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0) .getJSONObject("geometry").getJSONObject("location") .getDouble("lat"); } catch (Exception e) { e.printStackTrace(); } return new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6)); } 

esto es trabajado y probado … en API nivel 8 … hop this help ..

Leí el hilo de discusión mencionado por @ddewaele, alguien dijo que reiniciar puede resolver el problema. Lo hizo. Por cierto, la versión de Android de mi dispositivo es 4.1.

Latitude y longitute son tus valores respectivos

 Geocoder geocoder = new Geocoder(getBaseContext(), Locale.ENGLISH); try { List
addresses = geocoder.getFromLocation(latitude, longitude, 1); if (addresses.size() > 0) { Address returnedAddress = addresses.get(0); StringBuilder strReturnedAddress = new StringBuilder( "Address:\n"); for (int i = 0; i < returnedAddress .getMaxAddressLineIndex(); i++) { strReturnedAddress.append( returnedAddress.getAddressLine(i)).append("\n"); } adrs.setText(strReturnedAddress.toString()); } else { adrs.setText("No Address returned!"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

Un pequeño cambio en el código anterior permite reemplazar la llamada getFromLocationName que parece no ser compatible con algunas terminales:

 private static List
getAddrByWeb(JSONObject jsonObject){ List
res = new ArrayList
(); try { JSONArray array = (JSONArray) jsonObject.get("results"); for (int i = 0; i < array.length(); i++) { Double lon = new Double(0); Double lat = new Double(0); String name = ""; try { lon = array.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getDouble("lng"); lat = array.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getDouble("lat"); name = array.getJSONObject(i).getString("formatted_address"); Address addr = new Address(Locale.getDefault()); addr.setLatitude(lat); addr.setLongitude(lon); addr.setAddressLine(0, name != null ? name : ""); res.add(addr); } catch (JSONException e) { e.printStackTrace(); } } } catch (JSONException e) { e.printStackTrace(); } return res; }

}

Puede usar el código proporcionado por Mr.cyclopes49 como dos funciones y agregar llamadas de función a getLatLong() y getLocationInfo() en el método onCreate()

 JSONObject jo = this.getLocationInfo("vizianagaram"); GeoPoint p=this.getLatLong(jo); Toast.makeText(getBaseContext(), p.getLatitudeE6() / 1E6 + "," + p.getLongitudeE6() /1E6 , Toast.LENGTH_SHORT).show(); 

Esto funciona bien!