Show My Location

This example shows how to enable the My Location layer and demonstrates the My Location button to show the device's current position, represented by a blue dot, on the map.

For more information, see the documentation.

Get started

Before you can try the sample code, you must configure your development environment. For more information, see Maps SDK for Android code samples .

View the code

Kotlin

 class 
  
 MyLocationDemoActivity 
  
 : 
  
 SamplesBaseActivity 
 (), 
  
 OnMyLocationButtonClickListener 
 , 
  
 OnMyLocationClickListener 
 , 
  
 OnMapReadyCallback 
 , 
  
 OnRequestPermissionsResultCallback 
  
 { 
  
 /** 
 * Flag indicating whether a requested permission has been denied after returning in 
 * [.onRequestPermissionsResult]. 
 */ 
  
 private 
  
 var 
  
 permissionDenied 
  
 = 
  
 false 
  
 private 
  
 lateinit 
  
 var 
  
 map 
 : 
  
 GoogleMap 
  
 override 
  
 fun 
  
 onCreate 
 ( 
 savedInstanceState 
 : 
  
 Bundle?) 
  
 { 
  
 super 
 . 
 onCreate 
 ( 
 savedInstanceState 
 ) 
  
 setContentView 
 ( 
 R 
 . 
 layout 
 . 
 my_location_demo 
 ) 
  
 val 
  
 mapFragment 
  
 = 
  
 supportFragmentManager 
 . 
 findFragmentById 
 ( 
 R 
 . 
 id 
 . 
 map 
 ) 
  
 as 
  
 SupportMapFragment? 
  
 mapFragment 
 ?. 
 getMapAsync 
 ( 
 this 
 ) 
  
 applyInsets 
 ( 
 findViewById<View?>(R 
 . 
 id 
 . 
 map_container 
 )) 
  
 } 
  
 override 
  
 fun 
  
 onMapReady 
 ( 
 googleMap 
 : 
  
 GoogleMap 
 ) 
  
 { 
  
 map 
  
 = 
  
 googleMap 
  
 googleMap 
 . 
 setOnMyLocationButtonClickListener 
 ( 
 this 
 ) 
  
 googleMap 
 . 
 setOnMyLocationClickListener 
 ( 
 this 
 ) 
  
 enableMyLocation 
 () 
  
 } 
  
 /** 
 * Enables the My Location layer if the fine location permission has been granted. 
 */ 
  
 @SuppressLint 
 ( 
 "MissingPermission" 
 ) 
  
 private 
  
 fun 
  
 enableMyLocation 
 () 
  
 { 
  
 // 1. Check if permissions are granted, if so, enable the my location layer 
  
 if 
  
 ( 
 ContextCompat 
 . 
 checkSelfPermission 
 ( 
  
 this 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_FINE_LOCATION 
  
 ) 
  
 == 
  
 PackageManager 
 . 
 PERMISSION_GRANTED 
  
 || 
  
 ContextCompat 
 . 
 checkSelfPermission 
 ( 
  
 this 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_COARSE_LOCATION 
  
 ) 
  
 == 
  
 PackageManager 
 . 
 PERMISSION_GRANTED 
  
 ) 
  
 { 
  
 map 
 . 
 isMyLocationEnabled 
  
 = 
  
 true 
  
 return 
  
 } 
  
 // 2. If if a permission rationale dialog should be shown 
  
 if 
  
 ( 
 ActivityCompat 
 . 
 shouldShowRequestPermissionRationale 
 ( 
  
 this 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_FINE_LOCATION 
  
 ) 
  
 || 
  
 ActivityCompat 
 . 
 shouldShowRequestPermissionRationale 
 ( 
  
 this 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_COARSE_LOCATION 
  
 ) 
  
 ) 
  
 { 
  
 PermissionUtils 
 . 
 RationaleDialog 
 . 
 newInstance 
 ( 
  
 LOCATION_PERMISSION_REQUEST_CODE 
 , 
  
 true 
  
 ). 
 show 
 ( 
 supportFragmentManager 
 , 
  
 "dialog" 
 ) 
  
 return 
  
 } 
  
 // 3. Otherwise, request permission 
  
 ActivityCompat 
 . 
 requestPermissions 
 ( 
  
 this 
 , 
  
 arrayOf 
 ( 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_FINE_LOCATION 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_COARSE_LOCATION 
  
 ), 
  
 LOCATION_PERMISSION_REQUEST_CODE 
  
 ) 
  
 } 
  
 override 
  
 fun 
  
 onMyLocationButtonClick 
 (): 
  
 Boolean 
  
 { 
  
 Toast 
 . 
 makeText 
 ( 
 this 
 , 
  
 "MyLocation button clicked" 
 , 
  
 Toast 
 . 
 LENGTH_SHORT 
 ) 
  
 . 
 show 
 () 
  
 // Return false so that we don't consume the event and the default behavior still occurs 
  
 // (the camera animates to the user's current position). 
  
 return 
  
 false 
  
 } 
  
 override 
  
 fun 
  
 onMyLocationClick 
 ( 
 location 
 : 
  
 Location 
 ) 
  
 { 
  
 Toast 
 . 
 makeText 
 ( 
 this 
 , 
  
 "Current location:\n 
 $ 
 location 
 " 
 , 
  
 Toast 
 . 
 LENGTH_LONG 
 ) 
  
 . 
 show 
 () 
  
 } 
  
 override 
  
 fun 
  
 onRequestPermissionsResult 
 ( 
  
 requestCode 
 : 
  
 Int 
 , 
  
 permissions 
 : 
  
 Array<String> 
 , 
  
 grantResults 
 : 
  
 IntArray 
  
 ) 
  
 { 
  
 if 
  
 ( 
 requestCode 
  
 != 
  
 LOCATION_PERMISSION_REQUEST_CODE 
 ) 
  
 { 
  
 super 
 . 
 onRequestPermissionsResult 
 ( 
  
 requestCode 
 , 
  
 permissions 
 , 
  
 grantResults 
  
 ) 
  
 return 
  
 } 
  
 if 
  
 ( 
 isPermissionGranted 
 ( 
  
 permissions 
 , 
  
 grantResults 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_FINE_LOCATION 
  
 ) 
  
 || 
  
 isPermissionGranted 
 ( 
  
 permissions 
 , 
  
 grantResults 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_COARSE_LOCATION 
  
 ) 
  
 ) 
  
 { 
  
 // Enable the my location layer if the permission has been granted. 
  
 enableMyLocation 
 () 
  
 } 
  
 else 
  
 { 
  
 // Permission was denied. Display an error message 
  
 // ... 
  
 } 
  
 } 
  
 override 
  
 fun 
  
 onResumeFragments 
 () 
  
 { 
  
 super 
 . 
 onResumeFragments 
 () 
  
 if 
  
 ( 
 permissionDenied 
 ) 
  
 { 
  
 // Permission was not granted, display error dialog. 
  
 showMissingPermissionError 
 () 
  
 permissionDenied 
  
 = 
  
 false 
  
 } 
  
 } 
  
 /** 
 * Displays a dialog with error message explaining that the location permission is missing. 
 */ 
  
 private 
  
 fun 
  
 showMissingPermissionError 
 () 
  
 { 
  
 newInstance 
 ( 
 true 
 ). 
 show 
 ( 
 supportFragmentManager 
 , 
  
 "dialog" 
 ) 
  
 } 
  
 companion 
  
 object 
  
 { 
  
 /** 
 * Request code for location permission request. 
 * 
 * @see .onRequestPermissionsResult 
 */ 
  
 private 
  
 const 
  
 val 
  
 LOCATION_PERMISSION_REQUEST_CODE 
  
 = 
  
 1 
  
 } 
 } 
  
  

Java

 public 
  
 class 
 MyLocationDemoActivity 
  
 extends 
  
 SamplesBaseActivity 
  
 implements 
  
 OnMyLocationButtonClickListener 
 , 
  
 OnMyLocationClickListener 
 , 
  
 OnMapReadyCallback 
 , 
  
 ActivityCompat 
 . 
 OnRequestPermissionsResultCallback 
  
 { 
  
 /** 
 * Request code for location permission request. 
 * 
 * @see #onRequestPermissionsResult(int, String[], int[]) 
 */ 
  
 private 
  
 static 
  
 final 
  
 int 
  
 LOCATION_PERMISSION_REQUEST_CODE 
  
 = 
  
 1 
 ; 
  
 /** 
 * Flag indicating whether a requested permission has been denied after returning in {@link 
 * #onRequestPermissionsResult(int, String[], int[])}. 
 */ 
  
 private 
  
 boolean 
  
 permissionDenied 
  
 = 
  
 false 
 ; 
  
 private 
  
 GoogleMap 
  
 map 
 ; 
  
 @Override 
  
 protected 
  
 void 
  
 onCreate 
 ( 
 Bundle 
  
 savedInstanceState 
 ) 
  
 { 
  
 super 
 . 
 onCreate 
 ( 
 savedInstanceState 
 ); 
  
 setContentView 
 ( 
 com 
 . 
 example 
 . 
 common_ui 
 . 
 R 
 . 
 layout 
 . 
 my_location_demo 
 ); 
  
 SupportMapFragment 
  
 mapFragment 
  
 = 
  
 ( 
 SupportMapFragment 
 ) 
  
 getSupportFragmentManager 
 (). 
 findFragmentById 
 ( 
 com 
 . 
 example 
 . 
 common_ui 
 . 
 R 
 . 
 id 
 . 
 map 
 ); 
  
 mapFragment 
 . 
 getMapAsync 
 ( 
 this 
 ); 
  
 applyInsets 
 ( 
 findViewById 
 ( 
 com 
 . 
 example 
 . 
 common_ui 
 . 
 R 
 . 
 id 
 . 
 map_container 
 )); 
  
 } 
  
 @Override 
  
 public 
  
 void 
  
 onMapReady 
 ( 
 @NonNull 
  
 GoogleMap 
  
 googleMap 
 ) 
  
 { 
  
 map 
  
 = 
  
 googleMap 
 ; 
  
 map 
 . 
 setOnMyLocationButtonClickListener 
 ( 
 this 
 ); 
  
 map 
 . 
 setOnMyLocationClickListener 
 ( 
 this 
 ); 
  
 enableMyLocation 
 (); 
  
 } 
  
 /** 
 * Enables the My Location layer if the fine location permission has been granted. 
 */ 
  
 @SuppressLint 
 ( 
 "MissingPermission" 
 ) 
  
 private 
  
 void 
  
 enableMyLocation 
 () 
  
 { 
  
 // 1. Check if permissions are granted, if so, enable the my location layer 
  
 if 
  
 ( 
 ContextCompat 
 . 
 checkSelfPermission 
 ( 
 this 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_FINE_LOCATION 
 ) 
  
 == 
  
 PackageManager 
 . 
 PERMISSION_GRANTED 
  
 || 
  
 ContextCompat 
 . 
 checkSelfPermission 
 ( 
 this 
 , 
  
 permission 
 . 
 ACCESS_COARSE_LOCATION 
 ) 
  
 == 
  
 PackageManager 
 . 
 PERMISSION_GRANTED 
 ) 
  
 { 
  
 map 
 . 
 setMyLocationEnabled 
 ( 
 true 
 ); 
  
 return 
 ; 
  
 } 
  
 // 2. Otherwise, request location permissions from the user. 
  
 PermissionUtils 
 . 
 requestLocationPermissions 
 ( 
 this 
 , 
  
 LOCATION_PERMISSION_REQUEST_CODE 
 , 
  
 true 
 ); 
  
 } 
  
 @Override 
  
 public 
  
 boolean 
  
 onMyLocationButtonClick 
 () 
  
 { 
  
 Toast 
 . 
 makeText 
 ( 
 this 
 , 
  
 "MyLocation button clicked" 
 , 
  
 Toast 
 . 
 LENGTH_SHORT 
 ). 
 show 
 (); 
  
 // Return false so that we don't consume the event and the default behavior still occurs 
  
 // (the camera animates to the user's current position). 
  
 return 
  
 false 
 ; 
  
 } 
  
 @Override 
  
 public 
  
 void 
  
 onMyLocationClick 
 ( 
 @NonNull 
  
 Location 
  
 location 
 ) 
  
 { 
  
 Toast 
 . 
 makeText 
 ( 
 this 
 , 
  
 "Current location:\n" 
  
 + 
  
 location 
 , 
  
 Toast 
 . 
 LENGTH_LONG 
 ). 
 show 
 (); 
  
 } 
  
 @Override 
  
 public 
  
 void 
  
 onRequestPermissionsResult 
 ( 
 int 
  
 requestCode 
 , 
  
 @NonNull 
  
 String 
 [] 
  
 permissions 
 , 
  
 @NonNull 
  
 int 
 [] 
  
 grantResults 
 ) 
  
 { 
  
 if 
  
 ( 
 requestCode 
  
 != 
  
 LOCATION_PERMISSION_REQUEST_CODE 
 ) 
  
 { 
  
 super 
 . 
 onRequestPermissionsResult 
 ( 
 requestCode 
 , 
  
 permissions 
 , 
  
 grantResults 
 ); 
  
 return 
 ; 
  
 } 
  
 if 
  
 ( 
 PermissionUtils 
 . 
 isPermissionGranted 
 ( 
 permissions 
 , 
  
 grantResults 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_FINE_LOCATION 
 ) 
  
 || 
  
 PermissionUtils 
  
 . 
 isPermissionGranted 
 ( 
 permissions 
 , 
  
 grantResults 
 , 
  
 Manifest 
 . 
 permission 
 . 
 ACCESS_COARSE_LOCATION 
 )) 
  
 { 
  
 // Enable the my location layer if the permission has been granted. 
  
 enableMyLocation 
 (); 
  
 } 
  
 else 
  
 { 
  
 // Permission was denied. Display an error message 
  
 // ... 
  
 } 
  
 } 
  
 @Override 
  
 protected 
  
 void 
  
 onResumeFragments 
 () 
  
 { 
  
 super 
 . 
 onResumeFragments 
 (); 
  
 if 
  
 ( 
 permissionDenied 
 ) 
  
 { 
  
 // Permission was not granted, display error dialog. 
  
 showMissingPermissionError 
 (); 
  
 permissionDenied 
  
 = 
  
 false 
 ; 
  
 } 
  
 } 
  
 /** 
 * Displays a dialog with error message explaining that the location permission is missing. 
 */ 
  
 private 
  
 void 
  
 showMissingPermissionError 
 () 
  
 { 
  
 PermissionUtils 
 . 
 PermissionDeniedDialog 
  
 . 
 newInstance 
 ( 
 true 
 ). 
 show 
 ( 
 getSupportFragmentManager 
 (), 
  
 "dialog" 
 ); 
  
 } 
 } 
  
  

Clone and run the samples

Git is required to run this sample locally. The following command clones the sample application repository.

git clone git@github.com:googlemaps-samples/android-samples.git

Import the sample project into Android Studio:

  1. In Android Studio, select File > New > Import Project.
  2. Go to the location where you saved the repository and select the project directory for Kotlin or Java:

    • Kotlin: PATH-REPO /android-samples/ApiDemos/kotlin
    • Java: PATH-REPO /android-samples/ApiDemos/java
  3. Select Open. Android Studio builds your project, using the Gradle build tool.
  4. Create a blank secrets.properties file in the same directory as your project's local.properties file. For more information about this file, see Add your API key to the project .
  5. Get an API key from your project with the Maps SDK for Android enabled .
  6. Add the following string to secrets.properties , replacing YOUR_API_KEYwith the value of your API key:

    MAPS_API_KEY= YOUR_API_KEY 
    
  7. Run the app.
Create a Mobile Website
View Site in Mobile | Classic
Share by: