55 votes

Android: Géocodage inversé - getFromLocation

Je suis en train d'essayer d'obtenir une adresse basée sur le long/lat. il semble que quelque chose comme cela devrait fonctionner?

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

Le problème est que je reçois : La méthode Geocoder(paramètres Régionaux) n'est pas défini pour le type savemaplocation

Toute aide serait utile. Je vous remercie.


Merci, j'ai essayé le contexte, les paramètres régionaux en premier, et qui a échoué et était à la recherche à certains des autres constructeurs (j'avais vu un qui avait mentionné juste paramètres régionaux). Peu importe,

Il ne fonctionne pas, comme je suis encore en train : La méthode Geocoder(Contexte, les paramètres Régionaux) n'est pas défini pour le type savemaplocation

J'ai : import android.emplacement.Geocoder;

70voto

Wilfred Knievel Points 1476

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

51voto

EricLarch Points 2353

Voici un exemple complet de code à l'aide d'un Fil et d'un Gestionnaire d'obtenir le Geocoder réponse sans blocage de l'INTERFACE utilisateur.

Geocoder appel de la procédure, peuvent être situés dans une classe d'assistance

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 Geocoder procédure dans votre INTERFACE utilisateur d'Activité:

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

Et le gestionnaire d'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);
    }   
}

Ne pas oublier de mettre de l'autorisation suivante dans votre Manifest.xml

<uses-permission android:name="android.permission.INTERNET" />

37voto

Reto Meier Points 55904

Il semble comme il y a deux choses qui se passe ici.

1) Vous avez raté l' new mot-clé avant d'appeler le constructeur.

2) Le paramètre que vous êtes de passage dans le Geocoder constructeur est incorrect. Vous êtes de passage dans un Locale où il s'attend à un Context.

Il y a deux Geocoder constructeurs, qui exigent tous deux un Context, et un aussi de prendre un Locale:

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

Solution

Modifier votre code pour passer dans un Contexte valide et comprennent new et vous devriez être bon d'aller.

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

Note

Si vous rencontrez toujours des problèmes, il peut être un permissioning question. Le géocodage implicitement utilise l'Internet pour effectuer des recherches, de sorte que votre demande fera l'objet d'un INTERNET uses-permission de la balise dans votre manifeste.

Ajouter les utilisations suivantes-l'autorisation nœud à l'intérieur de l' manifest nœud de votre manifeste.

<uses-permission android:name="android.permission.INTERNET" />

8voto

Tom Points 151

La raison principale est le service backend:

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

5voto

Antony Points 433

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 ()).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X