web-dev-qa-db-fra.com

Pourquoi Android Geocoder génère-t-il une exception "Service non disponible"?

L'application utilise le Geocoder object. Cela fonctionne bien sur mon stock Froyo Nexus One. Mais ensuite, je lance exactement la même application sur un autre appareil (une tablette Advent Vega 10 "exécutant également Froyo) et j'obtiens cette exception: Service non disponible . La méthode que j'utilise est getFromLocationName(), I ' m bâtiment contre l'Android 1.6 Google API.

Je suis au courant d'un problème où cette exception est renvoyée sur l'émulateur, mais je suppose que c'est différent. Pourquoi serait-il jeté sur un appareil sous Froyo mais pas sur un autre?

L'application est une application de localisation. La tablette ne disposant pas de GPS ni de réseau mobile, dans un scénario où la connexion Wi-Fi ne fournit pas d'emplacement, l'utilisateur doit le spécifier manuellement, afin de ne pas pouvoir utiliser l'objet Geocoder. C'est une mauvaise nouvelle.

Je pourrais ajouter un moyen pour l'utilisateur de sélectionner l'emplacement sur une carte, mais ce n'est pas idéal. Je pourrais peut-être utiliser directement l'API Google Maps, mais je tiens tout d'abord à comprendre la nature du problème car il serait agréable d'avoir une solution plus simple.

Espérons que dans une prochaine version, Android inclura un "emplacement par défaut" au niveau du système d'exploitation pour les périphériques non-Geocoder, afin que les applications géolocalisées fonctionnent immédiatement avec des appareils tels que Google TV.

31
Ollie C

J'ai demandé à Reto Meier de Google de confirmer que ma théorie était correcte et il a déclaré: "Correct. Le géocodeur fait partie du module complémentaire API de Google qui ne fait pas partie de l'AOSP."

Ainsi, tout appareil qui ne vient pas avec le Play Store, les applications GMail, etc.… manquera également le back-end Geocoder.

26
Ollie C

Il semble y avoir une autre solution de contournement possible pour ce problème , qui est malheureusement considérée comme une question dupliquée et pourrait donc être manquée. Essentiellement, un redémarrage de l'appareil résout le problème. Notez que j'ai appelé cela une "solution de contournement" et non une "solution". :(

12
d60402

J'espère que ma réponse à un autre article est utile. Vous pouvez utiliser Google Geocoding API lorsque l'erreur de géocodage est détectée.

Pour plus de code => Obtenir la position actuelle en utilisant json

1
Megamind

Certains appareils n’ayant pas suport pour Geocoder, vous devez donc créer votre propre géocodeur.

En gros, vous devez créer une tâche asynchrone pour demander une adresse à Google et traiter la réponse JSON.

En utilisant aquery, je fais quelque chose comme ça:

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();
                        }
                }
        });        
}
1
Bruno Pinto

Après avoir perdu plusieurs heures, j'ai eu la solution la plus simple.

Je viens de redémarrer mon appareil, et il a commencé à fonctionner.

Il semble que le problème soit dû à un problème de mise en cache au niveau du système d'exploitation. J'espère que cela fonctionnera aussi pour votre ..

1
Neo

J'ai eu le même problème. J'ai utilisé la fonction suivante.

Remarque:

Utilisez context de votre activité et n'utilisez pas getApplicationContext() pour la fonction suivante

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