web-dev-qa-db-fra.com

Comment obtenir l'emplacement actuel dans Google Maps Android API v2?

En utilisant 

mMap.setMyLocationEnabled(true)

peut activer la couche myLocation.
Mais le problème est de savoir comment obtenir le myLocation lorsque l’utilisateur clique sur le bouton? Je souhaite obtenir la longitude et la latitude.

42
jjLin

L'emplacement de l'API Google Maps fonctionne maintenant, même avec des écouteurs. Vous pouvez le faire en utilisant ceci, par exemple:

private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
    @Override
    public void onMyLocationChange(Location location) {
        LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());
        mMarker = mMap.addMarker(new MarkerOptions().position(loc));
        if(mMap != null){
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
        }
    }
};

puis définissez l'auditeur pour la carte:

mMap.setOnMyLocationChangeListener(myLocationChangeListener);

Cela sera appelé lorsque la carte trouvera l’emplacement pour la première fois.

Pas besoin de LocationService ou LocationManager du tout.

OnMyLocationChangeListener interface est obsolète . utilisez plutôt com.google.Android.gms.location.FusedLocationProviderApi. FusedLocationProviderApi offre une localisation et une consommation d'énergie améliorées. Il est utilisé par le point bleu "Ma position". Voir MyLocationDemoActivity dans le dossier des exemples d'applications pour un exemple d'exemple de code ou le Guide du développeur d'emplacement.

56
yedidyak

Pour le moment, GoogleMap.getMyLocation () renvoie toujours la valeur null dans toutes les circonstances. 

À ma connaissance, il y a actuellement deux rapports de bogues vers Google, Numéro 40932 et Numéro 4644 .

L'implémentation d'un LocationListener comme mentionné précédemment serait incorrecte car le LocationListener ne serait pas synchronisé avec le LocationOverlay de la nouvelle API que vous essayez d'utiliser. 

Suivre le didacticiel sur le site de Vogella, lié précédemment par Pramod J George, vous indiquerait comment utiliser l'ancienne API Google Maps.

Donc, je m'excuse de ne pas vous donner une méthode pour récupérer votre position par ce moyen. Pour l'instant, locationListener est peut-être le seul moyen de le faire, mais je suis sûr que Google travaille à la résolution du problème dans la nouvelle API. 

Également désolé de ne pas avoir posté plus de liens, StackOverlow pense que je suis un spam, car je n'ai pas de représentant.

---- Mise à jour le 4 février 2013 ----

Google a indiqué que le problème serait résolu dans la prochaine mise à jour de l'API Google Maps via Issue 4644 . Je ne sais pas quand la mise à jour aura lieu, mais une fois que ce sera fait, je modifierai à nouveau ce post. 

---- Mise à jour le 10 avril 2013 ----

Google a indiqué que le problème avait été résolu via Issue 4644 . Cela devrait fonctionner maintenant.

31
Ryan Kara

essaye ça 

LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = service.getBestProvider(criteria, false);
Location location = service.getLastKnownLocation(provider);
LatLng userLocation = new LatLng(location.getLatitude(),location.getLongitude());
19
JcKim

Assurez-vous d’avoir activé les services de localisation sur le périphérique ..__ Sinon, vous ne recevrez aucune information relative à la localisation.

Ça marche pour moi

    map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
    map.setMyLocationEnabled(true);
    GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange (Location location) {
           LatLng loc = new LatLng (location.getLatitude(), location.getLongitude());
           map.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
        }
    };
    map.setOnMyLocationChangeListener(myLocationChangeListener);

}

3
rajnair

Pour obtenir l'emplacement lorsque l'utilisateur clique sur un bouton, appelez cette méthode dans onClick -

void getCurrentLocation() {
    Location myLocation  = mMap.getMyLocation();
    if(myLocation!=null)
    {
        double dLatitude = myLocation.getLatitude();
        double dLongitude = myLocation.getLongitude();
        Log.i("APPLICATION"," : "+dLatitude);
        Log.i("APPLICATION"," : "+dLongitude);
        mMap.addMarker(new MarkerOptions().position(
                new LatLng(dLatitude, dLongitude)).title("My Location").icon(BitmapDescriptorFactory.fromBitmap(Utils.getBitmap("pointer_icon.png"))));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8));

    }
    else
    {
        Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show();
    }

}

Assurez-vous également que le 

setMyLocationEnabled

est réglé sur vrai .

Essayez de voir si cela fonctionne ...

2
Anukool

essaye ça

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
    mMap.setMyLocationEnabled(true);
} else {
    // Show rationale and request permission.
}
1
SHINTO JOSEPH

Je viens de trouver cet extrait de code simple et fonctionnel, Essayez: 

public class MainActivity extends ActionBarActivity implements
    ConnectionCallbacks, OnConnectionFailedListener {
...
@Override
public void onConnected(Bundle connectionHint) {
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
    if (mLastLocation != null) {
        mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
        mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
    }
}}

voici le lien du tutoriel: Obtenir le dernier emplacement connu

1
ZAIRI Oussama

Avez-vous essayé GoogleMap.getMyLocation() ?

1
Anthony

Une seule condition, j'ai testé que ce n'était pas null était, si vous accordez suffisamment de temps à l'utilisateur pour appuyer sur le bouton de couche "obtenir mon emplacement", alors il n'aura pas la valeur null.

0
Mehran

la réponse acceptée fonctionne, mais certaines des méthodes utilisées sont maintenant obsolètes. Il est donc préférable de répondre à cette question avec des méthodes mises à jour.

c'est la réponse est complètement de ce guide sur les développeurs Google

alors voici un guide étape par étape:

  1. mettre en œuvre tout cela dans votre activité de carte

    MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks

  2. dans votre onCreate:

    private GoogleMap mMap;
    private Context context;
    private TextView txtStartPoint,txtEndPoint;
    private GoogleApiClient mGoogleApiClient;
    private Location mLastKnownLocation;
    private LatLng mDefaultLocation;
    private CameraPosition mCameraPosition;
    private boolean mLocationPermissionGranted;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    context = this;
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */,
                    this /* OnConnectionFailedListener */)
            .addConnectionCallbacks(this)
            .addApi(LocationServices.API)
            .addApi(Places.GEO_DATA_API)
            .addApi(Places.PLACE_DETECTION_API)
            .build();
    mGoogleApiClient.connect();
    }
    
  3. dans votre onConnected:

    SupportMapFragment mapFragment = (SupportMapFragment)     getSupportFragmentManager()
            .findFragmentById(map);
    mapFragment.getMapAsync(this);
    
  4. dans votre onMapReady:

    @Override
    public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    
    // Do other setup activities here too, as described elsewhere in this tutorial.
    
    // Turn on the My Location layer and the related control on the map.
    updateLocationUI();
    
    // Get the current location of the device and set the position of the map.
    getDeviceLocation();
    }
    
  5. et ces deux méthodes sont dans onMapReady:

    private void updateLocationUI() {
      if (mMap == null) {
        return;
    }
    
    if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
            Android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        mLocationPermissionGranted = true;
    }
    
    if (mLocationPermissionGranted) {
        mMap.setMyLocationEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
    } else {
        mMap.setMyLocationEnabled(false);
        mMap.getUiSettings().setMyLocationButtonEnabled(false);
        mLastKnownLocation = null;
    }
    }
    
    private void getDeviceLocation() {
    if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
            Android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        mLocationPermissionGranted = true;
    }
    
    if (mLocationPermissionGranted) {
        mLastKnownLocation = LocationServices.FusedLocationApi
                .getLastLocation(mGoogleApiClient);
    }
    
    // Set the map's camera position to the current location of the device.
    float DEFAULT_ZOOM = 15;
    if (mCameraPosition != null) {
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition));
    } else if (mLastKnownLocation != null) {
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                new LatLng(mLastKnownLocation.getLatitude(),
                        mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
    } else {
        Log.d("pouya", "Current location is null. Using defaults.");
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
        mMap.getUiSettings().setMyLocationButtonEnabled(false);
    }
    }
    

c'est très rapide, lisse et efficace. J'espère que cela t'aides

0
pouya

Il donnera l'emplacement actuel.

mMap.setMyLocationEnabled(true);
Location userLocation = mMap.getMyLocation();
        LatLng myLocation = null;
        if (userLocation != null) {
            myLocation = new LatLng(userLocation.getLatitude(),
                    userLocation.getLongitude());
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation,
                    mMap.getMaxZoomLevel()-5));
0
Dinesh IT

Essaye ça 

public class MyLocationListener implements LocationListener
{

 @Override

public void onLocationChanged(Location loc)
{

loc.getLatitude();

loc.getLongitude();

String Text = “My current location is: ” +

“Latitud = ” + loc.getLatitude() +

“Longitud = ” + loc.getLongitude();

Toast.makeText( getApplicationContext(),Text,   Toast.LENGTH_SHORT).show();



tvlat.setText(“”+loc.getLatitude());

tvlong.setText(“”+loc.getLongitude());

this.gpsCurrentLocation();

}
0
Usman Kurd

Je préférerais utiliser FusedLocationApi puisque OnMyLocationChangeListener est obsolète.

Commençons par déclarer ces 3 variables:

private LocationRequest  mLocationRequest;
private GoogleApiClient  mGoogleApiClient;
private LocationListener mLocationListener;

Définir les méthodes: 

private void initGoogleApiClient(Context context)
{
    mGoogleApiClient = new GoogleApiClient.Builder(context).addApi(LocationServices.API).addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks()
    {
        @Override
        public void onConnected(Bundle bundle)
        {
            mLocationRequest = LocationRequest.create();
            mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            mLocationRequest.setInterval(1000);

            setLocationListener();
        }

        @Override
        public void onConnectionSuspended(int i)
        {
            Log.i("LOG_TAG", "onConnectionSuspended");
        }
    }).build();

    if (mGoogleApiClient != null)
        mGoogleApiClient.connect();

}

private void setLocationListener()
{
    mLocationListener = new LocationListener()
    {
        @Override
        public void onLocationChanged(Location location)
        {
            String lat = String.valueOf(location.getLatitude());
            String lon = String.valueOf(location.getLongitude());
            Log.i("LOG_TAG", "Latitude = " + lat + " Longitude = " + lon);
        }
    };

    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mLocationListener);
}

private void removeLocationListener()
{
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mLocationListener);
}
  • initGoogleApiClient() est utilisé pour initialiser l'objet GoogleApiClient
  • setLocationListener() est utilisé pour configurer l'écouteur de changement d'emplacement
  • removeLocationListener() est utilisé pour supprimer l'auditeur

Appelez la méthode initGoogleApiClient pour que le code fonctionne :) N'oubliez pas de supprimer le programme d'écoute (mLocationListener) à la fin pour éviter les problèmes de fuite de mémoire.

0
Sa Qada