J'ai cherché haut et bas une réponse à ce sujet, et personne, dans aucune question du forum, n'a été en mesure de vous aider. J'ai parcouru les tutoriels. Le Guide de l'API dit:
Le bouton Ma position apparaît dans le coin supérieur droit de l'écran uniquement lorsque la couche Ma position est activée.
Donc, je cherchais cette couche Ma position et je n’ai rien trouvé. Comment afficher ma position sur une carte Google?
Le Guide API a tout faux (vraiment Google?). Avec Maps API v2, vous n'avez pas besoin d'activer une couche pour vous montrer, il existe un simple appel à l'instance GoogleMaps que vous avez créée avec votre carte.
La documentation fournie par Google vous donne la réponse. Vous avez juste besoin de
// map is a GoogleMap object
map.isMyLocationEnabled = true
// map is a GoogleMap object
map.setMyLocationEnabled(true);
et regarder la magie se produire.
Assurez-vous simplement que vous avez l'autorisation de localisation et demandé à l'exécution à l'API de niveau 23 (M) ou supérieur.
Code Java:
public class MapActivity extends FragmentActivity implements LocationListener {
GoogleMap googleMap;
LatLng myPosition;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
// Getting reference to the SupportMapFragment of activity_main.xml
SupportMapFragment fm = (SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map);
// Getting GoogleMap object from the fragment
googleMap = fm.getMap();
// Enabling MyLocation Layer of Google Map
googleMap.setMyLocationEnabled(true);
// Getting LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
// Creating a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Getting the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Getting Current Location
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
// Getting latitude of the current location
double latitude = location.getLatitude();
// Getting longitude of the current location
double longitude = location.getLongitude();
// Creating a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
myPosition = new LatLng(latitude, longitude);
googleMap.addMarker(new MarkerOptions().position(myPosition).title("Start"));
}
}
}
activity_map.xml:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:map="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/map"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
class="com.google.Android.gms.maps.SupportMapFragment"/>
Vous obtiendrez votre position actuelle dans un cercle bleu.
À partir de Android 6.0, vous devez vérifier l'autorisation de l'utilisateur. Si vous souhaitez utiliser GoogleMap.setMyLocationEnabled(true)
, vous obtiendrez Call requires permission which may be rejected by user
Erreur
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mMap.setMyLocationEnabled(true);
} else {
// Show rationale and request permission.
}
si vous voulez en savoir plus, cochez Google Map Docs
Pour afficher le bouton "Ma position", vous devez appeler
map.getUiSettings().setMyLocationButtonEnabled(true);
sur votre objet GoogleMap.
Appelez GoogleMap.setMyLocationEnabled(true)
dans votre Activity
et ajoutez ce code de 2 lignes dans le Manifest
:
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
Avant d'activer la couche Mon emplacement, vous devez demander l'autorisation de l'emplacement à l'utilisateur. Cet exemple n'inclut pas de demande d'autorisation de localisation.
Pour simplifier, en termes de lignes de code, la demande d'autorisation de localisation peut être effectuée à l'aide de la bibliothèque EasyPermissions .
Ensuite, en suivant l’exemple de la documentation officielle de couche My Location , mon code fonctionne comme suit pour toutes les versions d’Android qui contiennent Services Google.
OnMyLocationClickListener
y OnMyLocationButtonClickListener
.implementation 'pub.devrel:easypermissions:2.0.1'
Transmettre les résultats à EasyPermissions dans la méthode onRequestPermissionsResult()
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
Demander la permission et opérer en fonction de la réponse de l'utilisateur avec requestLocationPermission()
requestLocationPermission()
et réglez les auditeurs sur onMapReady()
.public class MapsActivity extends FragmentActivity implements
OnMapReadyCallback,
GoogleMap.OnMyLocationClickListener,
GoogleMap.OnMyLocationButtonClickListener {
private final int REQUEST_LOCATION_PERMISSION = 1;
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
requestLocationPermission();
mMap.setOnMyLocationButtonClickListener(this);
mMap.setOnMyLocationClickListener(this);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to EasyPermissions
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@SuppressLint("MissingPermission")
@AfterPermissionGranted(REQUEST_LOCATION_PERMISSION)
public void requestLocationPermission() {
String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION};
if(EasyPermissions.hasPermissions(this, perms)) {
mMap.setMyLocationEnabled(true);
Toast.makeText(this, "Permission already granted", Toast.LENGTH_SHORT).show();
}
else {
EasyPermissions.requestPermissions(this, "Please grant the location permission", REQUEST_LOCATION_PERMISSION, perms);
}
}
@Override
public boolean onMyLocationButtonClick() {
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public void onMyLocationClick(@NonNull Location location) {
Toast.makeText(this, "Current location:\n" + location, Toast.LENGTH_LONG).show();
}
}