web-dev-qa-db-fra.com

comment obtenir le nom de la ville de mon poste actuel?

Je travaille avec Android studio et dans une boîte de dialogue contextuelle, je veux que les utilisateurs puissent obtenir leur position, mais tout ce que je sais, c'est obtenir ma latitude et ma longitude.

C'est le code

import Android.app.Activity;
import Android.content.Context;
import Android.location.Criteria;
import Android.location.Location;
import Android.location.LocationListener;
import Android.location.LocationManager;
import Android.os.Bundle;
import Android.widget.TextView;
import Android.widget.Toast;

public class MainActivity extends Activity implements LocationListener {
    private TextView latituteField;
    private TextView longitudeField;
    private LocationManager locationManager;
    private String provider;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        latituteField = (TextView) findViewById(R.id.TextView02);
        longitudeField = (TextView) findViewById(R.id.TextView04);


        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);


        if (location != null) {
            System.out.println("Provider " + provider + " has been selected.");
            onLocationChanged(location);
        } else {
            latituteField.setText("Location not available");
            longitudeField.setText("Location not available");
        }
    }


    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(provider, 400, 1, this);
    }


    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
    }

    @Override
    public void onLocationChanged(Location location) {
        int lat = (int) (location.getLatitude());
        int lng = (int) (location.getLongitude());
        latituteField.setText(String.valueOf(lat));
        longitudeField.setText(String.valueOf(lng));
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {


    }

    @Override
    public void onProviderEnabled(String provider) {
        Toast.makeText(this, "Enabled new provider " + provider,
                Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onProviderDisabled(String provider) {
        Toast.makeText(this, "Disabled provider " + provider,
                Toast.LENGTH_SHORT).show();
    }
} 

dans la MainActivity.Pouvez-vous m'aider?

Je l'ai ajouté dans le manifeste

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_MOCK_LOCATION"/>

mais il indique toujours "Emplacement non disponible".


23
Rick

Vous avez besoin de la classe GeoCoder pour obtenir Address à partir d'un Lat/Long donné. essayez ce qui suit:

Geocoder geoCoder = new Geocoder(this, Locale.getDefault()); //it is Geocoder
StringBuilder builder = new StringBuilder();
try {
    List<Address> address = geoCoder.getFromLocation(latitude, longitude, 1);
    int maxLines = address.get(0).getMaxAddressLineIndex();
    for (int i=0; i<maxLines; i++) {
    String addressStr = address.get(0).getAddressLine(i);
    builder.append(addressStr);
    builder.append(" ");
    }

String fnialAddress = builder.toString(); //This is the complete address.
} catch (IOException e) {}
  catch (NullPointerException e) {}

Le code ci-dessous devrait fonctionner pour vous: (Vérifiez les commentaires en ligne concernant votre code)

import Java.io.IOException;
import Java.util.List;
import Java.util.Locale;

import Android.app.Activity;
import Android.content.Context;
import Android.location.Address;
import Android.location.Criteria;
import Android.location.Geocoder;
import Android.location.Location;
import Android.location.LocationListener;
import Android.location.LocationManager;
import Android.os.Bundle;
import Android.widget.TextView;
import Android.widget.Toast;

public class MainActivity extends Activity implements LocationListener {
private TextView latituteField;
private TextView longitudeField;
private TextView addressField; //Add a new TextView to your activity_main to display the address
private LocationManager locationManager;
private String provider;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    latituteField = (TextView) findViewById(R.id.TextView02);
    longitudeField = (TextView) findViewById(R.id.TextView04);
    addressField = (TextView) findViewById(R.id.TextView05); //Make sure you add this to activity_main


    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);


    if (location != null) {
        System.out.println("Provider " + provider + " has been selected.");
        onLocationChanged(location);
    } else {
        latituteField.setText("Location not available");
        longitudeField.setText("Location not available");
    }
}


@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 400, 1, this);
}


@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {
    //You had this as int. It is advised to have Lat/Loing as double.
    double lat = location.getLatitude();
    double lng = location.getLongitude();

    Geocoder geoCoder = new Geocoder(this, Locale.getDefault());
    StringBuilder builder = new StringBuilder();
    try {
        List<Address> address = geoCoder.getFromLocation(lat, lng, 1);
        int maxLines = address.get(0).getMaxAddressLineIndex();
        for (int i=0; i<maxLines; i++) {
            String addressStr = address.get(0).getAddressLine(i);
            builder.append(addressStr);
            builder.append(" ");
        }

        String fnialAddress = builder.toString(); //This is the complete address.

        latituteField.setText(String.valueOf(lat));
        longitudeField.setText(String.valueOf(lng));
        addressField.setText(fnialAddress); //This will display the final address.

    } catch (IOException e) {
        // Handle IOException
    } catch (NullPointerException e) {
        // Handle NullPointerException
    }
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {


}

@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();

}

@Override
public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
            Toast.LENGTH_SHORT).show();
}
}
31
gsb

Vous devez exécuter le géocodeur dans un AysncTask (ou dans un thread qui n'est pas dans le même ThreadGroup que le thread d'interface utilisateur)!

public void getCityName(final Location location, final OnGeocoderFinishedListener listener) {
   new AsyncTask<Void, Integer, List<Address>>() {
      @Override
      protected List<Address> doInBackground(Void... arg0) {
         Geocoder coder = new Geocoder(getContext(), Locale.ENGLISH);
         List<Address> results = null;
         try {
            results = coder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
         } catch (IOException e) {
            // nothing
         }
         return results;
      }

      @Override
      protected void onPostExecute(List<Address> results) {
         if (results != null && listener != null) {
            listener.onFinished(results);
         }
      }
   }.execute();
}

Avec cet écouteur abstrait

public abstract class OnGeocoderFinishedListener {
   public abstract void onFinished(List<Address> results);
}

Appelez maintenant la méthode comme ceci:

getCityName(location, new OnGeocoderFinishedListener() {
   @Override
   public void onFinished(List<Address> results) {
      // do something with the result
   }
});

J'espère que cela aidera certains d'entre vous!

13
Kai Burghardt

Vous pouvez utiliser Google api pour obtenir l'adresse de l'emplacement actuel. Découvrez ma réponse dans cet article, allez chercher votre ville.

Comment obtenir le nom de la ville à partir des coordonnées de latitude et de longitude dans Google Maps?

0
Vipul Purohit