How to display my location on Google Maps for Android API v2

前端 未结 6 2003
抹茶落季
抹茶落季 2020-12-07 15:03

I\'ve looked high and low for an answer on this, and no one, in any forum question has been able to help. I\'ve searched through the tutorials. The API Guide says:

相关标签:
6条回答
  • 2020-12-07 15:09

    Before enabling the My Location layer, you must request location permission from the user. This sample does not include a request for location permission.

    To simplify, in terms of lines of code, the request for the location permit can be made using the library EasyPermissions.

    Then following the example of the official documentation of The My Location Layer my code works as follows for all versions of Android that contain Google services.

    1. Create an activity that contains a map and implements the interfaces OnMyLocationClickListener y OnMyLocationButtonClickListener.
    2. Define in app/build.gradle implementation 'pub.devrel:easypermissions:2.0.1'
    3. Forward results to EasyPermissions within method onRequestPermissionsResult()

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

    4. Request permission and operate according to the user's response with requestLocationPermission()

    5. Call requestLocationPermission() and set the listeners to 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 讨论(0)
  • 2020-12-07 15:16

    The API Guide has it all wrong (really Google?). With Maps API v2 you do not need to enable a layer to show yourself, there is a simple call to the GoogleMaps instance you created with your map.

    Google Documentation

    The actual documentation that Google provides gives you your answer. You just need to

    If you are using Kotlin

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


    If you are using Java

    // map is a GoogleMap object
    map.setMyLocationEnabled(true);
    

    and watch the magic happen.

    Just make sure that you have location permission and requested it at runtime on API Level 23 (M) or above

    0 讨论(0)
  • 2020-12-07 15:18

    From android 6.0 you need to check for user permission, if you want to use GoogleMap.setMyLocationEnabled(true) you will get Call requires permission which may be rejected by user error

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

    if you want to read more, check google map docs

    0 讨论(0)
  • 2020-12-07 15:28

    Call GoogleMap.setMyLocationEnabled(true) in your Activity, and add this 2 lines code in the Manifest:

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
    0 讨论(0)
  • 2020-12-07 15:30

    To show the "My Location" button you have to call

    map.getUiSettings().setMyLocationButtonEnabled(true);
    

    on your GoogleMap object.

    0 讨论(0)
  • 2020-12-07 15:31

    Java code:

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

    You will get your current location in a blue circle.

    0 讨论(0)
提交回复
热议问题