- Overview
- Core Components
- Main Functionality
- Implementation Details
- Location Services
- Route Simulation
- Error Handling
- Logging System
- Performance Optimization
- User Interface
MapsActivity is an Android activity based on Google Maps SDK, providing real-time location tracking, path drawing, and location simulation features. It uses ViewBinding for view binding and FusedLocationProviderClient for location service management.
private val pathPoints = mutableListOf<LatLng>() // Store path points
private var polyline: Polyline? = null // Path line object
private lateinit var mMap: GoogleMap // Map object
private lateinit var binding: ActivityMapsBinding // View binding
private lateinit var fusedLocationClient: FusedLocationProviderClient // Location service client
private lateinit var locationCallback: LocationCallback // Location callback
private var currentLocationMarker: Marker? = null // Current location marker
private var isTrackingEnabled = true // Tracking statusflowchart TD
A[onCreate] --> B[Initialize View Binding]
B --> C[Initialize Location Client]
C --> D[Get Map Fragment]
D --> E[Set Button Listeners]
E --> F[Wait for Map Ready]
F --> G[onMapReady]
G --> H{Check Permissions}
H -->|Granted| I[Initialize Location Service]
H -->|Denied| J[Request Permissions]
flowchart TD
A[setupLocationServices] --> B{Check Permissions}
B -->|Failed| C[Notify User]
B -->|Success| D{Check GPS}
D -->|Off| E[Prompt to Enable GPS]
D -->|On| F[Configure Map UI]
F --> G[Set Location Request]
G --> H[Register Location Callback]
H --> I[Request Location Updates]
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY, 2000L
)
.setMinUpdateDistanceMeters(1f)
.setGranularity(Granularity.GRANULARITY_FINE)
.setWaitForAccurateLocation(true)
.build()- Update Interval: 2 seconds
- Minimum Distance: 1 meter
- Accuracy: High
- Wait for Accurate Location
private fun updatePolyline() {
polyline?.remove()
if (pathPoints.size > 1) {
polyline = mMap.addPolyline(
PolylineOptions()
.addAll(pathPoints)
.color(android.graphics.Color.BLUE)
.width(8f)
)
}
}private fun updateLocationMarker(latLng: LatLng) {
if (currentLocationMarker == null) {
currentLocationMarker = mMap.addMarker(
MarkerOptions()
.position(latLng)
.title("Current Location")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
)
} else {
currentLocationMarker?.position = latLng
}
}sequenceDiagram
participant A as Activity
participant L as LocationClient
participant G as GPS
participant N as Network
A->>L: Request Location Update
L->>G: Try GPS Location
alt GPS Success
G->>L: Return Location
L->>A: Update UI
else GPS Failure
L->>N: Try Network Location
N->>L: Return Location
L->>A: Update UI
end
- Try to get last known location
- If failed, start high-accuracy GPS location
- If GPS location fails, fallback to network location
- Continue updating location information
val simulatedPoints = listOf(
LatLng(39.916345, 116.397155), // Forbidden City
LatLng(39.908722, 116.397499), // Tiananmen Square
LatLng(39.900269, 116.397872), // Qianmen
LatLng(39.893, 116.397) // Near Temple of Heaven
)flowchart TD
A[Start Simulation] --> B[Clear Old Data]
B --> C[Set Simulation Points]
C --> D[Create Handler]
D --> E[Update Location Periodically]
E --> F[Update Path]
F --> G[Update Marker]
G --> H[Move Camera]
H --> E
private fun hasLocationPermissions(): Boolean {
val fine = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
val coarse = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
return fine == PackageManager.PERMISSION_GRANTED &&
coarse == PackageManager.PERMISSION_GRANTED
}- SecurityException: Permission-related exceptions
- Location service not enabled
- Location acquisition failure
- Network location failure
Use "MAP" tag for key information:
- Initialization status
- Permission status
- Location updates
- Error messages
- D: Debug information
- E: Error information
- I: Important status changes
- Minimum update distance limit
- Smart power management
- Location accuracy balance
- Timely cleanup of location update listeners
- Appropriate path point storage strategy
- Location button
- Zoom controls
- Compass
- Manual refresh button
- Route simulation button
- Toast message notifications
- Location update animations
- Path drawing animations