How can I show current location on a Google Map on Android Marshmallow?

后端 未结 3 1332
夕颜
夕颜 2020-11-21 22:56

I want google maps to show the location of the user. I tried this code, but it did not work on Android 6.

private GoogleMap map;
LocationManager lm;
Location         


        
3条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-21 23:22

    Firstly make sure your API Key is valid and add this into your manifest

    Here's my maps activity.. there might be some redundant information in it since it's from a larger project I created.

    import android.content.Intent;
    import android.content.IntentSender;
    import android.location.Location;
    import android.support.v4.app.FragmentActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    import com.google.android.gms.common.ConnectionResult;
    import com.google.android.gms.common.api.GoogleApiClient;
    import com.google.android.gms.location.LocationListener;
    import com.google.android.gms.location.LocationRequest;
    import com.google.android.gms.location.LocationServices;
    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.OnMapReadyCallback;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.Marker;
    import com.google.android.gms.maps.model.MarkerOptions;
    
    public class MapsActivity extends FragmentActivity implements
            GoogleApiClient.ConnectionCallbacks,
            GoogleApiClient.OnConnectionFailedListener,
            LocationListener {
    
    
        //These variable are initalized here as they need to be used in more than one methid
        private double currentLatitude; //lat of user
        private double currentLongitude; //long of user
    
        private double latitudeVillageApartmets= 53.385952001750184;
        private double longitudeVillageApartments= -6.599087119102478;
    
    
        public static final String TAG = MapsActivity.class.getSimpleName();
    
        private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    
        private GoogleMap mMap; // Might be null if Google Play services APK is not available.
    
        private GoogleApiClient mGoogleApiClient;
        private LocationRequest mLocationRequest;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_maps);
            setUpMapIfNeeded();
    
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
    
            // Create the LocationRequest object
            mLocationRequest = LocationRequest.create()
                    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                    .setInterval(10 * 1000)        // 10 seconds, in milliseconds
                    .setFastestInterval(1 * 1000); // 1 second, in milliseconds
     }
        /*These methods all have to do with the map and wht happens if the activity is paused etc*/
        //contains lat and lon of another marker
        private void setUpMap() {
    
                MarkerOptions marker = new MarkerOptions().position(new LatLng(latitudeVillageApartmets, longitudeVillageApartments)).title("1"); //create marker
                mMap.addMarker(marker); // adding marker
        }
    
        //contains your lat and lon
        private void handleNewLocation(Location location) {
            Log.d(TAG, location.toString());
    
            currentLatitude = location.getLatitude();
            currentLongitude = location.getLongitude();
    
            LatLng latLng = new LatLng(currentLatitude, currentLongitude);
    
            MarkerOptions options = new MarkerOptions()
                    .position(latLng)
                    .title("You are here");
            mMap.addMarker(options);
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom((latLng), 11.0F));
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            setUpMapIfNeeded();
            mGoogleApiClient.connect();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
    
            if (mGoogleApiClient.isConnected()) {
                LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
                mGoogleApiClient.disconnect();
            }
        }
    
        private void setUpMapIfNeeded() {
            // Do a null check to confirm that we have not already instantiated the map.
            if (mMap == null) {
                // Try to obtain the map from the SupportMapFragment.
                mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                        .getMap();
                // Check if we were successful in obtaining the map.
                if (mMap != null) {
                    setUpMap();
                }
    
            }
        }
    
        @Override
        public void onConnected(Bundle bundle) {
            Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            if (location == null) {
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            }
            else {
                handleNewLocation(location);
            }
        }
    
        @Override
        public void onConnectionSuspended(int i) {
        }
    
        @Override
        public void onConnectionFailed(ConnectionResult connectionResult) {
            if (connectionResult.hasResolution()) {
                try {
                    // Start an Activity that tries to resolve the error
                    connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
                    /*
                     * Thrown if Google Play services canceled the original
                     * PendingIntent
                     */
                } catch (IntentSender.SendIntentException e) {
                    // Log the error
                    e.printStackTrace();
                }
            } else {
                /*
                 * If no resolution is available, display a dialog to the
                 * user with the error.
                 */
                Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode());
            }
        }
    
        @Override
        public void onLocationChanged(Location location) {
            handleNewLocation(location);
        }
    
    }
    

    There's a lot of methods here that are hard to understand but basically all update the map when it's paused etc. There are also connection timeouts etc. Sorry for just posting this, I tried to fix your code but I couldn't figure out what was wrong.

提交回复
热议问题