Implementing User Location Display in Google Maps API v2 for Android

Dec 08, 2025 · Programming · 10 views · 7.8

Keywords: Android | Google Maps API v2 | Location Display | setMyLocationEnabled | Runtime Permissions

Abstract: This technical article provides an in-depth analysis of displaying user current location in Android applications using Google Maps API v2. By examining the discrepancies between official documentation and practical implementation, it details the proper usage of the setMyLocationEnabled method with code examples in both Kotlin and Java. The article emphasizes the importance of runtime permission management and offers a comprehensive implementation framework to help developers avoid common pitfalls and ensure stable location functionality across different Android versions.

Understanding Google Maps API v2 Location Display Mechanism

In Android application development, integrating map functionality and displaying user current location is a common requirement. Google Maps API v2 provides a concise yet powerful interface for this purpose, though there are some discrepancies between official documentation and actual implementation that need clarification.

Core Method: setMyLocationEnabled

Unlike earlier API versions, Google Maps API v2 no longer requires enabling a specific "My Location layer." Instead, developers can directly control location display through the GoogleMap object's setMyLocationEnabled() method. This method accepts a boolean parameter - when set to true, a blue dot marking the user's current location appears on the map along with a location button in the top-right corner.

Code Implementation Examples

Here are implementations in two primary programming languages:

Kotlin Implementation

// Assuming map is an initialized GoogleMap object
map.isMyLocationEnabled = true

Java Implementation

// Assuming map is an initialized GoogleMap object
map.setMyLocationEnabled(true);

Importance of Permission Management

In Android 6.0 (API Level 23) and above, location permissions must be requested dynamically at runtime. Even if setMyLocationEnabled(true) is called in the code, the functionality won't work properly without the appropriate location permissions. Developers need to declare permissions in AndroidManifest.xml and check and request permissions at runtime.

Complete Implementation Framework

Here's a more comprehensive Java implementation example demonstrating how to combine permission checks with map initialization:

public class MapActivity extends FragmentActivity {
    private GoogleMap googleMap;
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        // Initialize map
        SupportMapFragment mapFragment = (SupportMapFragment) 
            getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this::onMapReady);
    }

    private void onMapReady(GoogleMap map) {
        googleMap = map;
        
        // Check permissions
        if (ContextCompat.checkSelfPermission(this, 
                Manifest.permission.ACCESS_FINE_LOCATION) == 
                PackageManager.PERMISSION_GRANTED) {
            enableMyLocation();
        } else {
            // Request permissions
            ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                LOCATION_PERMISSION_REQUEST_CODE);
        }
    }

    private void enableMyLocation() {
        if (googleMap != null) {
            try {
                googleMap.setMyLocationEnabled(true);
            } catch (SecurityException e) {
                // Handle permission exception
                Log.e("MapActivity", "Location permission not granted", e);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, 
            @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && 
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                enableMyLocation();
            }
        }
    }
}

Layout File Configuration

The corresponding layout file should include SupportMapFragment:

<?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:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Advanced Feature Extension

Beyond basic location display, developers can obtain more precise location information through LocationManager and add custom markers to the map. For example, retrieving the last known location and displaying specific markers:

// Get LocationManager instance
LocationManager locationManager = (LocationManager) 
    getSystemService(Context.LOCATION_SERVICE);

// Create location criteria
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setPowerRequirement(Criteria.POWER_LOW);

// Get best location provider
String provider = locationManager.getBestProvider(criteria, true);

if (provider != null) {
    Location location = locationManager.getLastKnownLocation(provider);
    if (location != null) {
        LatLng userLatLng = new LatLng(location.getLatitude(), 
            location.getLongitude());
        
        // Add custom marker
        googleMap.addMarker(new MarkerOptions()
            .position(userLatLng)
            .title("Current Location")
            .snippet("Latitude: " + location.getLatitude() + 
                    ", Longitude: " + location.getLongitude()));
        
        // Move camera to this location
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLatLng, 15));
    }
}

Performance Optimization Recommendations

In practical development, consider these optimization measures:

  1. Use getMapAsync() for asynchronous map loading to avoid blocking the main thread
  2. Choose appropriate location accuracy (fine or coarse) based on application requirements
  3. Reduce location update frequency when the app goes to background
  4. Handle various exception scenarios like GPS unavailability, permission denial, etc.
  5. Consider using Fused Location Provider API for more accurate and energy-efficient location information

Compatibility Considerations

To ensure application compatibility across different Android versions, developers need to:

By properly using the setMyLocationEnabled() method combined with appropriate permission management, developers can easily implement reliable location display functionality in Android applications. This approach not only provides concise code but also delivers excellent user experience, aligning with modern Android development best practices.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.