Android Местоположение отключено милями - PullRequest
0 голосов
/ 05 августа 2020

Мои изображения с гео-тегами приложения. Код, который я использую для получения этих геоданных, ниже

Я использовал 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 и найти среднее значение, например, как обрабатываются необработанные данные датчика?

...