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!