web-dev-qa-db-fra.com

Comment afficher ma position sur Google Maps pour Android API v2

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?

55
Yos233

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.

Documentation Google

La documentation fournie par Google vous donne la réponse. Vous avez juste besoin de

Si vous utilisez Kotlin

// map is a GoogleMap object
map.isMyLocationEnabled = true


Si vous utilisez Java

// 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.

139
Yos233

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.

37
UdiT

À 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

16
Vasil Valchev

Pour afficher le bouton "Ma position", vous devez appeler

map.getUiSettings().setMyLocationButtonEnabled(true);

sur votre objet GoogleMap.

14
25Solutions

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" />
7
Terranology

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.

  1. Créez une activité contenant une carte et implémentant les interfaces OnMyLocationClickListener y OnMyLocationButtonClickListener.
  2. Définir dans app/build.gradle implementation 'pub.devrel:easypermissions:2.0.1'
  3. Transmettre les résultats à EasyPermissions dans la méthode onRequestPermissionsResult()

    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);

  4. Demander la permission et opérer en fonction de la réponse de l'utilisateur avec requestLocationPermission()

  5. Appelez requestLocationPermission() et réglez les auditeurs sur onMapReady().

MapsActivity.Java

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();
    }
}

Source

0
CORONEL Braian