Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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; LocationListener ll; Location l;  LatLng pos;  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.start_layout);      lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);     ll = new LocationListener() {         @Override         public void onLocationChanged(Location location) {             l = (Location) location;         }          @Override         public void onStatusChanged(String provider, int status, Bundle extras) {}          @Override         public void onProviderEnabled(String provider) {}          @Override         public void onProviderDisabled(String provider) {}     };      SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()             .findFragmentById(R.id.nMap);     mapFragment.getMapAsync(this); }  @Override public void onMapReady(GoogleMap googleMap) {     map = googleMap;      if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {         lm.requestLocationUpdates(lm.NETWORK_PROVIDER, 0, 0, ll);     }      pos = new LatLng(l.getLatitude(), l.getLongitude());      // Add a marker in Sydney and move the camera     map.setMyLocationEnabled(true);     map.addMarker(new MarkerOptions().position(pos).title("Marker in Sydney"));     map.moveCamera(CameraUpdateFactory.newLatLng(pos)); } 

Here are the permissions I've set:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> 
like image 268
Z4F1 Avatar asked Jan 03 '16 22:01

Z4F1


People also ask

How do I get Google Maps to show my current location?

Quick tip: In the iPhone and Android apps, tapping the Current Location button twice will turn on compass mode. The app will center on your location, but the map will rotate to match the direction you're currently facing in real life.

How do I turn on current location on Android?

There are two ways to get the current location of any Android device: Android's Location Manager API. Fused Location Provider: Google Play Services Location APIs.


2 Answers

For using FusedLocationProviderClient with Google Play Services 11 and higher:

see here: How to get current Location in GoogleMap using FusedLocationProviderClient

For using (now deprecated) FusedLocationProviderApi:

If your project uses Google Play Services 10 or lower, using the FusedLocationProviderApi is the optimal choice.

The FusedLocationProviderApi offers less battery drain than the old open source LocationManager API. Also, if you're already using Google Play Services for Google Maps, there's no reason not to use it.

Here is a full Activity class that places a Marker at the current location, and also moves the camera to the current position.

It also checks for the Location permission at runtime for Android 6 and later (Marshmallow, Nougat, Oreo). In order to properly handle the Location permission runtime check that is necessary on Android M/Android 6 and later, you need to ensure that the user has granted your app the Location permission before calling mGoogleMap.setMyLocationEnabled(true) and also before requesting location updates.

public class MapLocationActivity extends AppCompatActivity         implements OnMapReadyCallback,         GoogleApiClient.ConnectionCallbacks,         GoogleApiClient.OnConnectionFailedListener,         LocationListener {      GoogleMap mGoogleMap;     SupportMapFragment mapFrag;     LocationRequest mLocationRequest;     GoogleApiClient mGoogleApiClient;     Location mLastLocation;     Marker mCurrLocationMarker;      @Override     protected void onCreate(Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          getSupportActionBar().setTitle("Map Location Activity");          mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);         mapFrag.getMapAsync(this);     }      @Override     public void onPause() {         super.onPause();          //stop location updates when Activity is no longer active         if (mGoogleApiClient != null) {             LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);         }     }      @Override     public void onMapReady(GoogleMap googleMap)     {         mGoogleMap=googleMap;         mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);          //Initialize Google Play Services         if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {             if (ContextCompat.checkSelfPermission(this,                     Manifest.permission.ACCESS_FINE_LOCATION)                     == PackageManager.PERMISSION_GRANTED) {                 //Location Permission already granted                 buildGoogleApiClient();                 mGoogleMap.setMyLocationEnabled(true);             } else {                 //Request Location Permission                 checkLocationPermission();             }         }         else {             buildGoogleApiClient();             mGoogleMap.setMyLocationEnabled(true);         }     }      protected synchronized void buildGoogleApiClient() {         mGoogleApiClient = new GoogleApiClient.Builder(this)                 .addConnectionCallbacks(this)                 .addOnConnectionFailedListener(this)                 .addApi(LocationServices.API)                 .build();         mGoogleApiClient.connect();     }      @Override     public void onConnected(Bundle bundle) {         mLocationRequest = new LocationRequest();         mLocationRequest.setInterval(1000);         mLocationRequest.setFastestInterval(1000);         mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);         if (ContextCompat.checkSelfPermission(this,                 Manifest.permission.ACCESS_FINE_LOCATION)                 == PackageManager.PERMISSION_GRANTED) {             LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);         }     }      @Override     public void onConnectionSuspended(int i) {}      @Override     public void onConnectionFailed(ConnectionResult connectionResult) {}      @Override     public void onLocationChanged(Location location)     {         mLastLocation = location;         if (mCurrLocationMarker != null) {             mCurrLocationMarker.remove();         }          //Place current location marker         LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());         MarkerOptions markerOptions = new MarkerOptions();         markerOptions.position(latLng);         markerOptions.title("Current Position");         markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));         mCurrLocationMarker = mGoogleMap.addMarker(markerOptions);          //move map camera         mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,11));      }      public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;     private void checkLocationPermission() {         if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)                 != PackageManager.PERMISSION_GRANTED) {              // Should we show an explanation?             if (ActivityCompat.shouldShowRequestPermissionRationale(this,                     Manifest.permission.ACCESS_FINE_LOCATION)) {                  // Show an explanation to the user *asynchronously* -- don't block                 // this thread waiting for the user's response! After the user                 // sees the explanation, try again to request the permission.                 new AlertDialog.Builder(this)                         .setTitle("Location Permission Needed")                         .setMessage("This app needs the Location permission, please accept to use location functionality")                         .setPositiveButton("OK", new DialogInterface.OnClickListener() {                             @Override                             public void onClick(DialogInterface dialogInterface, int i) {                                 //Prompt the user once explanation has been shown                                 ActivityCompat.requestPermissions(MapLocationActivity.this,                                         new String[]{Manifest.permission.ACCESS_FINE_LOCATION},                                         MY_PERMISSIONS_REQUEST_LOCATION );                             }                         })                         .create()                         .show();               } else {                 // No explanation needed, we can request the permission.                 ActivityCompat.requestPermissions(this,                         new String[]{Manifest.permission.ACCESS_FINE_LOCATION},                         MY_PERMISSIONS_REQUEST_LOCATION );             }         }     }      @Override     public void onRequestPermissionsResult(int requestCode,                                            String permissions[], int[] grantResults) {         switch (requestCode) {             case MY_PERMISSIONS_REQUEST_LOCATION: {                 // If request is cancelled, the result arrays are empty.                 if (grantResults.length > 0                         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                      // permission was granted, yay! Do the                     // location-related task you need to do.                     if (ContextCompat.checkSelfPermission(this,                             Manifest.permission.ACCESS_FINE_LOCATION)                             == PackageManager.PERMISSION_GRANTED) {                          if (mGoogleApiClient == null) {                             buildGoogleApiClient();                         }                         mGoogleMap.setMyLocationEnabled(true);                     }                  } else {                      // permission denied, boo! Disable the                     // functionality that depends on this permission.                     Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();                 }                 return;             }              // other 'case' lines to check for other             // permissions this app might request         }     }  } 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="vertical" android:layout_width="match_parent"     android:layout_height="match_parent">      <fragment xmlns:android="http://schemas.android.com/apk/res/android"         xmlns:tools="http://schemas.android.com/tools"         xmlns:map="http://schemas.android.com/apk/res-auto"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:id="@+id/map"         tools:context=".MapLocationActivity"         android:name="com.google.android.gms.maps.SupportMapFragment"/>  </LinearLayout> 

Result:

Show permission explanation if needed using an AlertDialog (this happens if the user denies a permission request, or grants the permission and then later revokes it in the settings):

enter image description here

Prompt the user for Location permission by calling ActivityCompat.requestPermissions():

enter image description here

Move camera to current location and place Marker when the Location permission is granted:

enter image description here

like image 75
Daniel Nugent Avatar answered Oct 08 '22 10:10

Daniel Nugent


Sorry but that's just much too much overhead (above), short and quick, if you have the MapFragment, you also have to map, just do the following:

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

Code is in Kotlin, hope you don't mind.

have fun

Btw I think this one is a duplicate of: Show Current Location inside Google Map Fragment

like image 29
cV2 Avatar answered Oct 08 '22 12:10

cV2