Мои изображения с гео-тегами приложения. Код, который я использую для получения этих геоданных, ниже
Я использовал getLastKnownLocation, однако эмулятор время от времени возвращал null, создавая фатальную ошибку sh. Я переключился на запрос обновлений местоположения, который, как я решил, мне понравился больше, потому что он давал очень точные показания. Единственная проблема заключается в том, что каждая 6-я или 7-я фотография дает значение от 500 метров до мили. Я не совсем понимаю, почему это происходит. Ниже приведен код, который получает данные о местоположении для отправки следующему фрагменту. Это местоположение изменено LocationCallback в приведенном ниже коде.
lifecycleScope.launch(Dispatchers.Main) {
try {
Log.d(TAG, "location is " + currentLocation.toString())
val timestamp : Long = System.currentTimeMillis()
Log.d(TAG, "time is " + timestamp.toString())
//Go to the photo editor when the photomoment has been successfully captured.
val action = CameraFragmentDirections.actionCameraFragmentToPhotoEditorFragment(
objId = timestamp.toString(),
newMoment = true,
lat = currentLocation.latitude.toString(),
lng = currentLocation.longitude.toString(),
time = timestamp,
filepath = photoPath
)
findNavController().navigate(action)
} catch (e: Exception) {
Log.d(TAG, "Something went wrong when adding location to moment data. Cause: ${e}")
val alert = LocationError()
alert.show(parentFragmentManager, "location")
}
}
Это код, который обновляет местоположение пользователя
private lateinit var fusedLocationClient: FusedLocationProviderClient
private val locationRequest = LocationRequest.create()?.apply {
interval = 10000
fastestInterval = 5000
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
private var locationAvailable = false
override fun onAttach(context: Context) {
super.onAttach(context)
//A Fragment injects Dagger in the onAttach method after calling super. BEST PRACTICE
(requireActivity().application as BarreApp).appComponent.inject(this)
val builder = LocationSettingsRequest.Builder()
val client: SettingsClient = LocationServices.getSettingsClient(requireActivity())
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build()).apply {
addOnSuccessListener { locationSettingsResponse ->
//Location is available
locationAvailable = true
}
addOnFailureListener {exception ->
if (exception is ResolvableApiException){
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
try {
// If we do not have location permission, send them back to CameraPermissionFragment
Navigation.findNavController(requireActivity(), R.id.nav_host_container).navigate(
CameraFragmentDirections.actionCameraFragmentToPermissionsFragment()
)
} catch (sendEx: IntentSender.SendIntentException) {
// Ignore the error.
}
}
}
}
fusedLocationClient = FusedLocationProviderClient(requireActivity())
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult ?: return
for (location in locationResult.locations){
currentLocation = location
}
}
}
}
/**
* Get the current user location
*/
private fun getCurrentLocation() {
Log.d(TAG, "Getting current location.")
try {
fusedLocationClient.requestLocationUpdates(locationRequest,
locationCallback,
Looper.getMainLooper())
} catch (e: SecurityException) {
Log.d(TAG, "Something went wrong when trying to get location for moment. Cause: ${e}")
val alert = LocationError()
alert.show(parentFragmentManager, "location")
}
}
override fun onPause() {
super.onPause()
fusedLocationClient.removeLocationUpdates(locationCallback)
}
Должен ли я брать местоположения в LocationCallback и найти среднее значение, например, как обрабатываются необработанные данные датчика?