Android: Géocodage inversé - getFromLocation
-
19-08-2019 - |
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;
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
Utilisez ceci
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);