Question

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 de recevoir: La méthode Geocoder (Locale) n'est pas définie pour le type savemaplocation

Toute aide serait utile. Merci.

Merci, j’ai essayé d’abord le contexte, les paramètres régionaux 1, mais j’ai échoué et j’ai examiné certains des autres constructeurs (j'en avais déjà vu un qui ne mentionnait que les paramètres régionaux). Peu importe,

Cela n’a pas fonctionné, car j’obtiens toujours: La méthode Geocoder (Context, Locale) n’est pas définie pour le type savemaplocation

J'ai les éléments suivants: import android.location.Geocoder;

Était-ce utile?

La solution

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

Autres conseils

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, pouvant ê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 de 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 l'autorisation suivante dans votre Manifest.xml

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

On dirait qu'il se passe deux choses 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 un paramètre régional à l'endroit où il attend un contexte .

Il existe deux constructeurs Geocoder , tous deux nécessitant un Contexte , et un prenant également un Paramètres régionaux :

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. Par conséquent, votre application nécessite une balise INTERNET uses-permission dans votre manifeste.

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

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

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 framework 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.

  

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, informations d’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 informations sur la ville sont maintenant en sb. Convertissez maintenant le sb en String (en utilisant sb.toString ()).

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 puisque getFromLocation peut émettre 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 qu'il lève des 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 il se bloque à chaque fois.

J'ai entendu dire que Geocoder était du côté des bogues. 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

Utilisez ceci

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top