2011-01-21 8 views
29

La aplicación utiliza el objeto Geocoder. Funciona bien en mi stock Froyo Nexus One. Pero luego ejecuto exactamente la misma aplicación en un dispositivo diferente (una tableta Advent Vega 10 "que también ejecuta Froyo) y obtengo esta excepción: Servicio no disponible. El método que estoy usando es getFromLocationName(), estoy construyendo contra el Android 1.6 API de Google.¿Por qué Android Geocoder arroja una excepción de "Servicio no disponible"?

soy consciente de un problema por el que esta excepción se produce en el emulador, pero sospecho que esto es diferente. ¿por qué sería ser lanzado en un dispositivo que ejecuta Froyo pero no en otro?

La aplicación es una aplicación de ubicación, y como la tableta no tiene GPS o red móvil, en un escenario donde la conexión Wi-Fi no proporciona una ubicación, el usuario debe especificarla manualmente, por lo que no podrá usar el objeto Geocoder son malas noticias.

Podría agregar una manera para que el usuario seleccione la ubicación en un mapa, pero no es ideal. Posiblemente podría usar la API de Google Maps directamente, pero estoy ansioso por comprender la naturaleza del problema primero, ya que sería bueno tener una solución más fácil.

Esperemos que en un futuro lanzamiento Android incluirá una "ubicación predeterminada" del nivel del sistema operativo para dispositivos que no sean Geocoder, por lo que las aplicaciones de reconocimiento de ubicación funcionan de forma automática en dispositivos como Google TV.

+0

veo en la documentación que dice "La clase Geocoder requiere un servicio de back-end eso no está incluido en el marco principal de Android "pero ¿por qué un proveedor de dispositivos no lo incluiría? ¿Un error? –

+0

¿El back-end de Geocoder se considera parte de la distribución de Android aprobada por Google? La tableta no tiene certificación de Google, por lo que no hay aplicaciones de Google Android (GMail, Market, etc.) en ella por defecto. Sospecho que es por eso. Parece que las personas en este tipo de dispositivos pueden tener que elegir la ubicación de un mapa, o quizás podría usar esa API de Maps directamente. Parece raro excluirlo, me encantaría saber por qué no está allí. –

Respuesta

25

Le pedí a Reto Meier de Google que confirmara que mi teoría era correcta y me dijo "Correcto. El Geocoder es parte del complemento API de Google que no es parte de AOSP".

Por lo tanto, cualquier dispositivo que no venga con la Play Store, las aplicaciones de GMail, etc ... también perderán el back-end de Geocoder.

+1

bien - solía funcionar en el emulador * antes * 2.2, por lo que no siempre ha sido así. – Matthias

+0

No he confirmado en las versiones del emulador, pero tengo una tableta que no es de Google que tiene Android v2.2 pero no tiene aplicaciones de Google, y el back-end del geocodificador no está en este dispositivo. –

+1

¿Qué opina de [esto] (http://developer.android.com/sdk/RELEASENOTES.html)? Establece que "el complemento API de Google también incluye una implementación del servicio back-end de Geocoder". ¿Esto significa que construir su proyecto contra el complemento API de Google en lugar de solo el SDK básico de Android incluirá automáticamente un back-end en su .apk? Noté que compiló contra v1.6 de la API de Google (a diferencia del SDK básico de Android), así que supongo que la respuesta es no, ya que no funcionó para usted. Por cierto, ¿cómo hablaste con Reto Meier? –

12

Parece haber another possible workaround for this problem, que desafortunadamente está marcado como una pregunta duplicada y, por lo tanto, puede perderse. Esencialmente, un reinicio del dispositivo aclara el problema. Tenga en cuenta que lo llamé una "solución alternativa" y no una "solución". :(

+1

Estoy buscando un método alternativo para resolver este error, sin reiniciar el dispositivo. ¿Existe? – UmbySlipKnot

+0

¡Lo encontré! Para evitar el reinicio, debes ** configurar el objetivo de compilación del proyecto en API 16 **. En Eclipse: haga clic con el botón secundario en Proyecto -> Ruta de acceso de compilación -> Configurar ruta de acceso de compilación -> Android -> Objetivo de compilación del proyecto. – UmbySlipKnot

+0

¿Cambiar realmente la API objetivo a 16 realmente resolvió el problema? ¿Alguien más ha intentado? Porque en este otro comentario (http://stackoverflow.com/a/15340668/778891) el autor dice que, después de todo, no funciona. – German

1

Algunos dispositivos no han suport para Geocoder, así que lo que hay que hacer es crear su propio codificador geográfico.

Básicamente lo que necesita crear una tarea asíncrona para solicitar Google para la dirección y el tratamiento de la respuesta JSON.

Usando aquery, hago algo como esto:

public void asyncJson(String address){ 
     address = address.replace(" ", "+"); 

     String url = "http://maps.googleapis.com/maps/api/geocode/json?address="+ address +"&sensor=true"; 

     aq.ajax(url, JSONObject.class, new AjaxCallback<JSONObject>() { 

       @Override 
       public void callback(String url, JSONObject json, AjaxStatus status) {       

         if(json != null){ 

           //here you work with the response json 
           JSONArray results = json.getJSONArray("results");        
           Toast.makeText(context, results.getJSONObject(1).getString("formatted_address")); 

         }else{         
           //ajax error, show error code 
           Toast.makeText(aq.getContext(), "Error:" + status.getCode(), Toast.LENGTH_LONG).show(); 
         } 
       } 
     });   
} 
0

que tenían el mismo problema. Usé la siguiente función.

Nota:

Uso context de su actividad y no utilice getApplicationContext() a la siguiente función

public static Address getLocalityFrmGeoCoder(Context context, Location mLocation) { 
     try { 
      if(mLocation!=null){ 
      Geocoder gCoder = new Geocoder(context, Locale.getDefault()); 
      List<Address> address = gCoder.getFromLocation(mLocation.getLatitude(), mLocation.getLongitude(), 1); 
      if (address.size() > 0) { 
       return address.get(0); 
      } 
      } 

     } catch (Exception e) { 
      Log.d("GEOCODER", "GEOCODER EXCEPTION"); 
      e.printStackTrace(); 

     } 
    return null; 
} 
Cuestiones relacionadas