2011-03-05 25 views
14

Usando emulador de Android 2.2 API 8 me siguen dando IOExceptionGeocoder.getFromLocation throws IOException el emulador de Android

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 

Ésta es mi código:

private LocationManager manager = null; 
LocationListener locationListener = null; 
double latitude = 0; 
double longtitude = 0; 
List<Address> 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<Address> 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 la geocodificación inversa siempre da un resultado vacío. ¿alguien podría confirmar mi código?

gracias.

gracias, ray.

+0

¿Está bajo un firewall o proxy? –

+0

¿Estás conectado a internet con tu emulador? verifica esto usando el navegador. –

+0

no estoy bajo firewall/proxy y sí, me conecto a internet. – rayman

Respuesta

21

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

En 2.2 API 8, recibirá el 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) véase la siguiente URL:

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

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

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

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

Si el GeoCoder devuelve una lista vacía, debe comprobar 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á configurado con las API de Google.

+0

He logrado hacerlo con Emulator 2.1 y API7, pero el código de codificación inversa siempre devuelve resultados vacíos, ¿hay alguna idea de por qué? – rayman

+0

rayman: He actualizado el contestador ... ¿Obtienes una excepción al realizar la búsqueda de Geocoder? – ddewaele

+0

No, solo en el resultado vacío en las direcciones de la lista (Enumere

direcciones) – rayman

10

Puede utilizar de lugar de Google API siguiente manera

crear un método que devuelve un JSONObject con la respuesta del HTTP llamada como seguir

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; 
} 

pasar ahora que JSONObject a getLatLong() método como el siguiente

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 se ha trabajado y probado ... en API nivel 8 ... hop this help ..

+0

No funciona en mi caso en Android 2.3.3, simplemente muestra el mismo error, es decir, no se pudo obtener el cliente de la fábrica de conexiones. – Harpreet

+0

esto funciona bien para todos google api 7,8,10 voy a probar en todos ... Haps tu error en algo ... solo publica tu código ... – cyclopes49

+0

Funcionó para mí también. Antes estaba jugando con el análisis KML y es un dolor de cabeza. Pero esta es una solución realmente agradable y simple. Saludos a GMaps. – YuDroid

0

Puede usar el código proporcionado por el Sr.cyclopes49 como dos funciones y añadir llamadas a funciones y getLatLong()getLocationInfo() en onCreate() método funciona comunicado muestra es

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!

2

Latitud y longitud son sus respectivos valores

Geocoder geocoder = new Geocoder(getBaseContext(), Locale.ENGLISH); 
     try { 
      List<Address> 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(); 

     } 
1

Un pequeño cambio en el código anterior, permite reemplazar getFromLocationName llamada que no parece compatible en algunos terminales:

private static List<Address> getAddrByWeb(JSONObject jsonObject){ 
    List<Address> res = new ArrayList<Address>(); 
    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; 
} 

}

4

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.

+0

muchas gracias y sí lo hizo ... en serio un reinicio resuelto !!!! .. Estaba buscando un día entero con mi código, permiso de internet, etc .... finalmente este me alegró el día, pero aún no lo hice t obtener la razón. ¿Cómo? –

Cuestiones relacionadas