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.
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.
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.
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());
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);
}
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 ...
essaye ça
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mMap.setMyLocationEnabled(true);
} else {
// Show rationale and request permission.
}
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
Avez-vous essayé GoogleMap.getMyLocation()
?
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.
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:
mettre en œuvre tout cela dans votre activité de carte
MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks
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();
}
dans votre onConnected
:
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(map);
mapFragment.getMapAsync(this);
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();
}
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
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));
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();
}
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'emplacementremoveLocationListener()
est utilisé pour supprimer l'auditeurAppelez 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.