我遇到过类似的文章,但他们没有完全回答我的具体问题:
我有一个连接到后端服务器的应用程序,例如现场考勤系统,用户(在本例中为技术人员)访问特定位置并使用照片功能记录他们的工作。该应用程序包括自动水印功能,可显示坐标和到站点的距离。
我已经为用户需要参观和拍照的地点设置了坐标。但是,我想对到站点的距离实施限制。如果用户在距离指定地点超过 100 米的地方拍照,我希望应用程序活动全屏显示对话框。
目前,我使用 Java 和 Kotlin 进行开发。
我怎样才能实现这个目标?
这是检索位置的代码:
class LocationService(context: Context): LiveData<Result<Throwable, Location?>>() {
private var fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
override fun onInactive() { // is called when the lifecycle owner(LocationActivity) is either paused, stopped or destroyed
super.onInactive()
fusedLocationClient.removeLocationUpdates(locationCallback)
}
override fun onActive() { // is called when the lifecycle owner(LocationActivity) is either started or resumed
super.onActive()
fusedLocationClient.lastLocation
.addOnSuccessListener { setLocationData(it) }
.addOnFailureListener {t -> setErrorData(t) }
startLocationUpdates()
}
private fun setLocationData(location: Location?) { // location is nullable as if GPS is turned off even if the last
// location was previously retrieve because disabling location clears the cache
//value = LocationEvent.OnLocationResult(Result.build { location })
value = Result.build { location }
}
private fun setErrorData(t: Throwable) {
//value = LocationEvent.OnLocationResult(Result.build { throw t })
value = Result.build { throw t }
}
private fun startLocationUpdates() {
Timber.d { "start location updates" }
fusedLocationClient.requestLocationUpdates(
locationRequest,
locationCallback,
null // looper
)
}
您可以使用 Android 地理围栏
地理围栏将用户当前位置的感知与用户与可能感兴趣的位置的接近度的感知结合起来。要标记感兴趣的位置,您可以指定其纬度和经度。要调整位置的接近度,您可以添加半径。纬度、经度和半径定义地理围栏,在感兴趣的位置周围创建一个圆形区域或围栏。
您可以拥有多个活动地理围栏,每个应用程序、每个设备用户的限制为 100 个。对于每个地理围栏,您可以要求定位服务向您发送进入和退出事件,或者您可以指定触发事件之前在地理围栏区域内等待或停留的持续时间。您可以通过指定过期持续时间(以毫秒为单位)来限制任何地理围栏的持续时间。地理围栏到期后,定位服务会自动将其删除。 更多