- Standortbestimmungfunktionalität hinzugefügt
This commit is contained in:
@@ -6,6 +6,9 @@
|
|||||||
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
||||||
<!-- ArcGIS Pro benötigt-->
|
<!-- ArcGIS Pro benötigt-->
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<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
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ import com.example.snapandsolve.camera.Intent
|
|||||||
import com.example.snapandsolve.ui.theme.AppColor
|
import com.example.snapandsolve.ui.theme.AppColor
|
||||||
import com.example.snapandsolve.ui.theme.ButtonColor
|
import com.example.snapandsolve.ui.theme.ButtonColor
|
||||||
import com.example.snapandsolve.ui.theme.WidgetColor
|
import com.example.snapandsolve.ui.theme.WidgetColor
|
||||||
|
import com.example.snapandsolve.ui.theme.setupLocationDisplay
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|
||||||
|
|
||||||
@@ -141,11 +142,15 @@ fun ContentScreen(
|
|||||||
createMap() //Funktion zur Erstellung der Map
|
createMap() //Funktion zur Erstellung der Map
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Standortbestimmung aus locationHelper.kt
|
||||||
|
val locationDisplay = setupLocationDisplay()
|
||||||
|
|
||||||
Box(modifier = modifier.fillMaxSize()) {
|
Box(modifier = modifier.fillMaxSize()) {
|
||||||
// HINTERGRUND: Die Map
|
// HINTERGRUND: Die Map
|
||||||
MapView(
|
MapView(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
arcGISMap = map
|
arcGISMap = map,
|
||||||
|
locationDisplay = locationDisplay
|
||||||
)
|
)
|
||||||
|
|
||||||
// VORDERGRUND: Das Overlay (wenn showReport = true)
|
// VORDERGRUND: Das Overlay (wenn showReport = true)
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user