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;
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);
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" />
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" />
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.
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 ()).
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.
Utilisez ceci
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
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