J'utilise l'API Google Maps v2 pour Android et fonctionne correctement ... Cependant, j'essaie d'utiliser le géocodeur pour obtenir la longitude et la latitude d'une adresse, mais sans succès.
Cela a changé la façon de le faire à partir de la v2?
J'utilise le code conventionnel
Geocoder gc = new Geocoder(context);
//...
List<Address> list = gc.getFromLocationName("1600 Amphitheatre Parkway, Mountain View, CA", 1);
Address address = list.get(0);
double lat = address.getLatitude();
double lng = address.getLongitude();
//...
Renvoie toujours un arrêt forcé et Log ne résout rien . Lors de l'utilisation d'un bloc try/catch, ouvre la carte mais toujours au même emplacement Utilisez l'autorisation Internet, j'ai également inclus dans le projet COARSE_LOCATION .J'ai utilisé divers codes situés ici et sur d'autres sites, mais sans succès.
Merci d'avance.
Essayez cette solution en utilisant cet exemple d'URL:
http://maps.google.com/maps/api/geocode/json?address=mumbai&sensor=false
qui retourne des données au format json
avec lat/lng
de address
.
private class DataLongOperationAsynchTask extends AsyncTask<String, Void, String[]> {
ProgressDialog dialog = new ProgressDialog(MainActivity.this);
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setMessage("Please wait...");
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
@Override
protected String[] doInBackground(String... params) {
String response;
try {
response = getLatLongByURL("http://maps.google.com/maps/api/geocode/json?address=mumbai&sensor=false");
Log.d("response",""+response);
return new String[]{response};
} catch (Exception e) {
return new String[]{"error"};
}
}
@Override
protected void onPostExecute(String... result) {
try {
JSONObject jsonObject = new JSONObject(result[0]);
double lng = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
double lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
Log.d("latitude", "" + lat);
Log.d("longitude", "" + lng);
} catch (JSONException e) {
e.printStackTrace();
}
if (dialog.isShowing()) {
dialog.dismiss();
}
}
}
public String getLatLongByURL(String requestURL) {
URL url;
String response = "";
try {
url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setDoOutput(true);
int responseCode = conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = br.readLine()) != null) {
response += line;
}
} else {
response = "";
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
J'espère que cela vous aidera.
Essayez ceci.
private void getLatLongFromAddress(String address)
{
double lat= 0.0, lng= 0.0;
Geocoder geoCoder = new Geocoder(this, Locale.getDefault());
try
{
List<Address> addresses = geoCoder.getFromLocationName(address , 1);
if (addresses.size() > 0)
{
GeoPoint p = new GeoPoint(
(int) (addresses.get(0).getLatitude() * 1E6),
(int) (addresses.get(0).getLongitude() * 1E6));
lat=p.getLatitudeE6()/1E6;
lng=p.getLongitudeE6()/1E6;
Log.d("Latitude", ""+lat);
Log.d("Longitude", ""+lng);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
puisque le HttpClient a été amorti, vous pouvez essayer le code suivant avec Asynctask (notez également que nous devons encoder l'adresse dans une URL):
public class GeoCoding extends AsyncTask<Void, Void, Void> {
private String address;
private static final String TAG = GeoCoding.class.getSimpleName();
JSONObject jsonObj;
String URL;
private String Address1 = "", Address2 = "", City = "", State = "", Country = "", County = "", PIN = "", Area="";
private double latitude, longitude;
HttpURLConnection connection;
BufferedReader br;
StringBuilder sb ;
public GeoCoding(String address){
this.address = address;
}
public String getArea(){
return Area;
}
public void getAddress() {
Address1 = "";
Address2 = "";
City = "";
State = "";
Country = "";
County = "";
PIN = "";
Area ="";
try {
String Status = jsonObj.getString("status");
if (Status.equalsIgnoreCase("OK")) {
JSONArray Results = jsonObj.getJSONArray("results");
JSONObject zero = Results.getJSONObject(0);
JSONArray address_components = zero.getJSONArray("address_components");
for (int i = 0; i < address_components.length(); i++) {
JSONObject zero2 = address_components.getJSONObject(i);
String long_name = zero2.getString("long_name");
JSONArray mtypes = zero2.getJSONArray("types");
String Type = mtypes.getString(0);
if (! TextUtils.isEmpty(long_name) || !long_name.equals(null) || long_name.length() > 0 || !long_name.equals("")) {
if (Type.equalsIgnoreCase("street_number")) {
Address1 = long_name + " ";
} else if (Type.equalsIgnoreCase("route")) {
Address1 = Address1 + long_name;
} else if (Type.equalsIgnoreCase("sublocality")) {
Address2 = long_name;
} else if (Type.equalsIgnoreCase("locality")) {
City = long_name;
} else if (Type.equalsIgnoreCase("administrative_area_level_2")) {
County = long_name;
} else if (Type.equalsIgnoreCase("administrative_area_level_1")) {
State = long_name;
} else if (Type.equalsIgnoreCase("country")) {
Country = long_name;
} else if (Type.equalsIgnoreCase("postal_code")) {
PIN = long_name;
}else if( Type.equalsIgnoreCase("neighborhood")){
Area = long_name;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void getGeoPoint(){
try{
longitude = ((JSONArray)jsonObj.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
latitude = ((JSONArray)jsonObj.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
}catch (Exception e){
e.printStackTrace();
}
}
@Override
protected Void doInBackground(Void... params) {
try {
StringBuilder urlStringBuilder = new StringBuilder("http://maps.google.com/maps/api/geocode/json");
urlStringBuilder.append("?address=" + URLEncoder.encode(address, "utf8"));
urlStringBuilder.append("&sensor=false");
URL = urlStringBuilder.toString();
Log.d(TAG, "URL: " + URL);
URL url = new URL(URL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.connect();
br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb = sb.append(line + "\n");
}
}catch (Exception e){e.printStackTrace(); }
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
try {
Log.d(TAG, "response code: " + connection.getResponseCode());
jsonObj = new JSONObject(sb.toString());
Log.d(TAG, "JSON obj: " + jsonObj);
getAddress();
Log.d(TAG, "area is: " + getArea());
getGeoPoint();
Log.d("latitude", "" + latitude);
Log.d("longitude", "" + longitude);
}
} catch (Exception e) {
e.printStackTrace();
}
super.onPostExecute(aVoid);
}
}
Une simple rectification qui a fonctionné pour moi consiste simplement à activer la connexion Internet sur l'appareil. Suggestion de Pxaml .