web-dev-qa-db-fra.com

Android: géocodage inversé - getFromLocation

J'essaie d'obtenir une adresse basée sur le long/lat. il semble que quelque chose comme ça devrait fonctionner? 

Geocoder myLocation = Geocoder(Locale.getDefault());
    List myList = myLocation.getFromLocation(latPoint,lngPoint,1);

Le problème est que je continue à avoir: La méthode Geocoder (Locale) est indéfinie pour le type savemaplocation

Toute aide serait utile. Je vous remercie.


Merci, j'ai essayé le contexte, les paramètres régionaux un d’abord, et cela a échoué. Je me suis tourné vers certains des autres constructeurs (j’en ai vu un qui mentionnait uniquement les paramètres régionaux). Indépendamment,

Cela ne fonctionnait pas, comme je l’obtiens encore: La méthode Geocoder (Context, Locale) n’est pas définie pour le type savemaplocation.

J'ai: importer Android.location.Geocoder;

48
Chrispix

L'extrait de code suivant le fait pour moi (lat et lng sont des doubles déclarés au-dessus de ce bit):

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
65
Wilfred Knievel

Voici un exemple de code complet utilisant un thread et un gestionnaire pour obtenir la réponse du géocodeur sans bloquer l'interface utilisateur.

Procédure d'appel du géocodeur, peut être située dans une classe Helper

public static void getAddressFromLocation(
        final Location location, final Context context, final Handler handler) {
    Thread thread = new Thread() {
        @Override public void run() {
            Geocoder geocoder = new Geocoder(context, Locale.getDefault());   
            String result = null;
            try {
                List<Address> list = geocoder.getFromLocation(
                        location.getLatitude(), location.getLongitude(), 1);
                if (list != null && list.size() > 0) {
                    Address address = list.get(0);
                    // sending back first address line and locality
                    result = address.getAddressLine(0) + ", " + address.getLocality();
                }
            } catch (IOException e) {
                Log.e(TAG, "Impossible to connect to Geocoder", e);
            } finally {
                Message msg = Message.obtain();
                msg.setTarget(handler);
                if (result != null) {
                    msg.what = 1;
                    Bundle bundle = new Bundle();
                    bundle.putString("address", result);
                    msg.setData(bundle);
                } else 
                    msg.what = 0;
                msg.sendToTarget();
            }
        }
    };
    thread.start();
}

Voici l'appel à cette procédure de géocodeur dans votre activité d'interface utilisateur:

getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler());

Et le gestionnaire pour afficher les résultats dans votre interface utilisateur:

private class GeocoderHandler extends Handler {
    @Override
    public void handleMessage(Message message) {
        String result;
        switch (message.what) {
        case 1:
            Bundle bundle = message.getData();
            result = bundle.getString("address");
            break;
        default:
            result = null;
        }
        // replace by what you need to do
        myLabel.setText(result);
    }   
}

N'oubliez pas de mettre la permission suivante dans votre Manifest.xml

<uses-permission Android:name="Android.permission.INTERNET" />
47
EricLarch

On dirait qu'il y a deux choses qui se passent ici.

1) Vous avez oublié le mot clé new avant d'appeler le constructeur.

2) Le paramètre que vous transmettez au constructeur Geocoder est incorrect. Vous passez dans une Locale où il s’attend à une Context.

Il existe deux constructeurs Geocoder, qui requièrent tous deux une Context, et un prenant également un Locale:

Geocoder(Context context, Locale locale)
Geocoder(Context context)

Solution

Modifiez votre code pour qu'il passe dans un contexte valide et incluez new et vous devriez être prêt à partir.

Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1);

Remarque

Si vous rencontrez toujours des problèmes, il peut s'agir d'un problème d'autorisation. Le géocodage utilise implicitement Internet pour effectuer les recherches. Votre application nécessite donc une balise INTERNET uses-permission dans votre manifeste. 

Ajoutez le noeud uses-permission suivant dans le nœud manifest de votre manifeste.

<uses-permission Android:name="Android.permission.INTERNET" />
35
Reto Meier

La raison en est le service backend inexistant:

La classe Geocoder nécessite un service d’arrière-plan qui n’est pas inclus dans le cadre principal Android. Les méthodes de requête Geocoder renverront une liste vide s'il n'y a pas de service backend sur la plateforme. 

8
Ingo

Obtenez d’abord la latitude et la longitude en utilisant les classes Location et LocationManager. Maintenant, essayez le code ci-dessous pour Obtenir la ville, adresse

double latitude = location.getLatitude();
double longitude = location.getLongitude();
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
    List<Address> addresses = gc.getFromLocation(lat, lng, 1);
    StringBuilder sb = new StringBuilder();
    if (addresses.size() > 0) {
        Address address = addresses.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());
    }

Les infos sur la ville sont maintenant à sb. Convertissez maintenant le sb en String (en utilisant sb.toString ()). 

4
Antony

Eh bien, je suis toujours perplexe. Donc, voici plus de code. 

Avant de quitter ma carte, j'appelle SaveLocation(myMapView,myMapController);. C'est ce qui finit par appeler mes informations de géocodage.

Mais comme getFromLocation peut lancer une IOException, j'ai dû procéder comme suit pour appeler SaveLocation

try
{
    SaveLocation(myMapView,myMapController);
}
catch (IOException e) 
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Ensuite, je dois changer SaveLocation en disant que cela jette IOExceptions: 

 public void SaveLocation(MapView mv, MapController mc) throws IOException{
    //I do this : 
    Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
    List myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
//...
    }

Et ça plante à chaque fois.

2
Chrispix

Utilisez ceci

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
0
Sojan Ks

J'ai entendu dire que Geocoder était du côté buggy. J'ai récemment mis sur pied un exemple d'application qui utilise le service de géocodage http de Google pour rechercher un emplacement depuis la dernière minute. Ne hésitez pas à vérifier ici

http://www.smnirven.com/?p=39

0
user186939