- Standortbestimmungfunktionalität hinzugefügt

This commit is contained in:
2025-12-20 11:22:12 +01:00
parent 2f781abcc2
commit e7f0ef03ad
3 changed files with 118 additions and 1 deletions

View File

@@ -6,6 +6,9 @@
<uses-feature android:name="android.hardware.camera" android:required="false" />
<!-- ArcGIS Pro benötigt-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Für Standortbestimmung -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"

View File

@@ -67,6 +67,7 @@ import com.example.snapandsolve.camera.Intent
import com.example.snapandsolve.ui.theme.AppColor
import com.example.snapandsolve.ui.theme.ButtonColor
import com.example.snapandsolve.ui.theme.WidgetColor
import com.example.snapandsolve.ui.theme.setupLocationDisplay
import kotlinx.coroutines.Dispatchers
@@ -141,11 +142,15 @@ fun ContentScreen(
createMap() //Funktion zur Erstellung der Map
}
//Standortbestimmung aus locationHelper.kt
val locationDisplay = setupLocationDisplay()
Box(modifier = modifier.fillMaxSize()) {
// HINTERGRUND: Die Map
MapView(
modifier = Modifier.fillMaxSize(),
arcGISMap = map
arcGISMap = map,
locationDisplay = locationDisplay
)
// VORDERGRUND: Das Overlay (wenn showReport = true)

View File

@@ -0,0 +1,109 @@
package com.example.snapandsolve.ui.theme
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.widget.Toast
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.rememberCoroutineScope
import androidx.core.content.ContextCompat
import com.arcgismaps.location.LocationDisplayAutoPanMode
import com.arcgismaps.mapping.view.LocationDisplay
import com.arcgismaps.toolkit.geoviewcompose.rememberLocationDisplay
import kotlinx.coroutines.launch
/**
* Helper-Klasse für Standort-Funktionalität
*/
class LocationHelper(private val context: Context) {
/**
* Prüft, ob Standort-Berechtigungen erteilt wurden
*/
fun hasLocationPermissions(): Boolean {
val coarseLocation = ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_COARSE_LOCATION
) == PackageManager.PERMISSION_GRANTED
val fineLocation = ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
return coarseLocation && fineLocation
}
}
/**
* Composable zum Einrichten des Location Display
*
* @param autoPanMode Wie die Karte dem Standort folgen soll (default: Recenter)
* @return LocationDisplay-Objekt, das an MapView übergeben werden kann
*/
@Composable
fun setupLocationDisplay(
autoPanMode: LocationDisplayAutoPanMode = LocationDisplayAutoPanMode.Recenter
): LocationDisplay {
val context = androidx.compose.ui.platform.LocalContext.current
val coroutineScope = rememberCoroutineScope()
val locationHelper = LocationHelper(context)
val locationDisplay = rememberLocationDisplay().apply {
setAutoPanMode(autoPanMode)
}
if (locationHelper.hasLocationPermissions()) {
LaunchedEffect(Unit) {
locationDisplay.dataSource.start()
}
} else {
RequestLocationPermissions(
context = context,
onPermissionsGranted = {
coroutineScope.launch {
locationDisplay.dataSource.start()
}
}
)
}
return locationDisplay
}
/**
* Composable zum Anfordern von Standort-Berechtigungen
*/
@Composable
private fun RequestLocationPermissions(
context: Context,
onPermissionsGranted: () -> Unit
) {
val activityResultLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
if (permissions.all { it.value }) {
onPermissionsGranted()
} else {
Toast.makeText(
context,
"Standort-Berechtigung wurde verweigert",
Toast.LENGTH_LONG
).show()
}
}
LaunchedEffect(Unit) {
activityResultLauncher.launch(
arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
)
)
}
}