2010-12-02 19 views
26

Después de varios días para aprender cómo funciona Android, decidí crear mi primera aplicación: una aplicación simple que muestra el GMap desde una dirección proporcionada por el usuario con un simple widget EditText.
Uso Geocoder para hacer eso.Error RPC con Geocoder

Después de un poco de control de errores con Logcat, aquí es la excepción devuelto por ADB:

E/LocationMasfClient( 53): forwardGeocode(): RPC failed with status 1 
W/System.err( 262): java.io.IOException: RPC failed with status 1 
W/System.err( 262): at android.location.Geocoder.getFromLocationName(Geocoder.java:166) 
W/System.err( 262): at fr.meetopia.tinymap.MapViewActivity.testGeoCoder(MapViewActivity.java:104) 
W/System.err( 262): at fr.meetopia.tinymap.MapViewActivity.onCreate(MapViewActivity.java:38) 
W/System.err( 262): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
W/System.err( 262): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
W/System.err( 262): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
W/System.err( 262): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
W/System.err( 262): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 

Y ahora aquí está el código señalado por el seguimiento de la pila:

Geocoder geoCoder = new Geocoder(this); 
MapView mapView = (MapView) findViewById(R.id.mapview); 
    MapController mc = mapView.getController(); 
    GeoPoint p; 
    try { 
     List<Address> addresses = geoCoder.getFromLocationName("paris france", 50); 
     if (addresses.size() > 0) { 
      p = new GeoPoint(
        (int) (addresses.get(0).getLatitude() * 1E6), 
        (int) (addresses.get(0).getLongitude() * 1E6)); 
      mc.animateTo(p);  
      mapView.invalidate(); 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Obviamente, este código es una parte de una instanciación MapActivity.

Hice algunas pruebas con diferentes versiones de Google APIS (8, 7, 4) y diferentes versiones de la plataforma SDK (2.2, 2.1, 1.6), pero no tuve suerte. Me di cuenta de que Google API 8 contiene un error conocido y devolvió un Service Unavailable Exception en lugar de RPC Failed 1.

Por otro lado, traté de ejecutar mi aplicación directamente en mi dispositivo (HTC Desire 2.1) y noté el mismo comportamiento (es decir: sin comportamiento, un mapa con EE. UU. En el centro).

Aquí viene la facilidad de uso de la autorización de manifiesto de Android:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
+2

¿Ha logrado encontrar la causa de esto? ¡Tengo exactamente el mismo problema! –

+10

¿Ha configurado correctamente la clave API para Google Maps? No puede usar Geocodificación sin usar Google Maps también. Para la clave, consulte aquí http://code.google.com/intl/de-DE/android/maps-api-signup.html – Stefan

+0

¿Ha verificado que su servicio de geocodificación esté presente? p.ej. geocoder.isPresent() devuelve verdadero? – Kyle

Respuesta

1

Ésta es mi función de geocodificación, su trabajo muy bien en Google API 7. La esperanza de su útil

public GeoPoint geoCoding(String name){ 
     Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
     GeoPoint p = null; 
      try { 
       List<Address> addresses = geoCoder.getFromLocationName(
        name, 5); 
       if (addresses.size() > 0) { 
        p = new GeoPoint(
          (int) (addresses.get(0).getLatitude() * 1E6), 
          (int) (addresses.get(0).getLongitude() * 1E6)); 

       }  
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return p; 
     } 
2

Creo que hay dos razones para usted.

  1. No lo probé, pero Geocoder aún no estará disponible cuando se ejecuta en el simulador. Incluso si geocoder.isPresent() devuelve verdadero. Hay solución en la web, acaba de leer Issue 8816 - android para getFromLocationName (..) en la Observación 21 y al que está conectado ReverseGeocoder.java

  2. Al igual que Stefan dijo: Cuando puso en marcha el dispositivo no se necesita la clave de API. Tiene que ser agregado en el layout.xml de tu vista de mapa.

mejor manera de crear y probar un MapView para mí era para ponerlo en práctica de manera normal y registrar y tratar la solución si "servicio no disponible" .equals (exception.getMessage()).

1

La clase Geocoder tiene errores. A veces funciona de manera extraña. Recomiendo no utilizar para obtener la ubicación. En cambio, API de búsqueda local y administrador de ubicación para usar servicios de ubicación.