gpt4 book ai didi

android - 在 kotlin 中的 requestLocationUpdates 之后移动标记而不是添加它

转载 作者:搜寻专家 更新时间:2023-11-01 09:28:44 25 4
gpt4 key购买 nike

我在本教程的帮助下在 kotlin 中使用谷歌地图 Introduction to Google Maps API for Android with Kotlin .在本教程中展示了如何在位置更新后添加标记但是当它更新时,以前的位置仍然有一个标记并一次又一次地添加。这段代码中没有标记对象,我想先添加标记,然后再移动它。我怎样才能做到这一点?谢谢

 class MapsActivity : AppCompatActivity(), OnMapReadyCallback,
GoogleMap.OnMarkerClickListener {

private lateinit var map: GoogleMap
private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var lastLocation: Location

private lateinit var locationCallback: LocationCallback
private lateinit var locationRequest: LocationRequest
private var locationUpdateState = false

companion object {
private const val LOCATION_PERMISSION_REQUEST_CODE = 1
private const val REQUEST_CHECK_SETTINGS = 2
private const val PLACE_PICKER_REQUEST = 3
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)

fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

locationCallback = object : LocationCallback() {
override fun onLocationResult(p0: LocationResult) {
super.onLocationResult(p0)

lastLocation = p0.lastLocation
placeMarkerOnMap(LatLng(lastLocation.latitude, lastLocation.longitude))
}
}

createLocationRequest()

val fab = findViewById<FloatingActionButton>(R.id.fab)
fab.setOnClickListener {
loadPlacePicker()
}
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CHECK_SETTINGS) {
if (resultCode == Activity.RESULT_OK) {
locationUpdateState = true
startLocationUpdates()
}
}
if (requestCode == PLACE_PICKER_REQUEST) {
if (resultCode == RESULT_OK) {
val place = PlacePicker.getPlace(this, data)
var addressText = place.name.toString()
addressText += "\n" + place.address.toString()

placeMarkerOnMap(place.latLng)
}
}
}

override fun onPause() {
super.onPause()
fusedLocationClient.removeLocationUpdates(locationCallback)
}

public override fun onResume() {
super.onResume()
if (!locationUpdateState) {
startLocationUpdates()
}
}

override fun onMapReady(googleMap: GoogleMap) {
map = googleMap

map.uiSettings.isZoomControlsEnabled = true
map.setOnMarkerClickListener(this)

setUpMap()
}

override fun onMarkerClick(p0: Marker?) = true

private fun setUpMap() {
if (ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), LOCATION_PERMISSION_REQUEST_CODE)
return
}

map.isMyLocationEnabled = true
map.mapType = GoogleMap.MAP_TYPE_NORMAL

fusedLocationClient.lastLocation.addOnSuccessListener(this) { location ->
// Got last known location. In some rare situations this can be null.
if (location != null) {
lastLocation = location
val currentLatLng = LatLng(location.latitude, location.longitude)
placeMarkerOnMap(currentLatLng)
map.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 12f))
}
}
}

private fun placeMarkerOnMap(location: LatLng) {
val markerOptions = MarkerOptions().position(location)

val titleStr = getAddress(location) // add these two lines
markerOptions.title(titleStr)

map.addMarker(markerOptions)

}


private fun startLocationUpdates() {
if (ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),
LOCATION_PERMISSION_REQUEST_CODE)
return
}
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null /* Looper */)

}

private fun createLocationRequest() {
locationRequest = LocationRequest()
locationRequest.interval = 10000
locationRequest.fastestInterval = 5000
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

val builder = LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest)
val client = LocationServices.getSettingsClient(this)
val task = client.checkLocationSettings(builder.build())

task.addOnSuccessListener {
locationUpdateState = true
startLocationUpdates()
}
task.addOnFailureListener { e ->
if (e is ResolvableApiException) {
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
e.startResolutionForResult(this@MapsActivity,
REQUEST_CHECK_SETTINGS)
} catch (sendEx: IntentSender.SendIntentException) {
// Ignore the error.
}
}
}
}

private fun loadPlacePicker() {
val builder = PlacePicker.IntentBuilder()

try {
startActivityForResult(builder.build(this@MapsActivity), PLACE_PICKER_REQUEST)
} catch (e: GooglePlayServicesRepairableException) {
e.printStackTrace()
} catch (e: GooglePlayServicesNotAvailableException) {
e.printStackTrace()
}
}
}

最佳答案

GoogleMapaddMarker() 方法返回 Marker .

您需要保留对返回标记的引用,稍后使用 setPosition 方法更新它的位置。

关于android - 在 kotlin 中的 requestLocationUpdates 之后移动标记而不是添加它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48961177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com