从 kotlin 中的 Mapbox 获取我的位置 LatLng

Getting my location LatLng from Mapbox in kotlin

我正在尝试在使用 kotlin 构建的 android 应用程序上使用 mapbox 获取我的位置。我正在使用 locationComponent 方法来获取它,这是我的代码:

class PlaceholderFragment : Fragment(), OnMapReadyCallback, PermissionsListener {
    private var permissionsManager: PermissionsManager = PermissionsManager(this)
    private var mapboxMap: MapboxMap? = null
    private var myCurrentLocation: LatLng? = null
    var navigationMapRoute: NavigationMapRoute? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        pageViewModel = ViewModelProviders.of(this).get(PageViewModel::class.java).apply {
            setIndex(arguments?.getInt(ARG_SECTION_NUMBER) ?: 1)
        }
        val theActivity = activity as NavigationActivity?
        theSteps = theActivity?.theSteps
        case = theActivity?.case
        case = theActivity.case
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        activity?.let {
            Mapbox.getInstance(
                it,
                getString(com.innoventiq.arkbeh.R.string.mapbox_access_token2)
            )
        }
        val root =
            inflater.inflate(com.innoventiq.arkbeh.R.layout.fragment_navigation, container, false)
        return root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mapView.onCreate(savedInstanceState)
        mapView.getMapAsync(this)
        getMyLocation()
    }

    override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {
        Toast.makeText(
            activity,
            com.innoventiq.arkbeh.R.string.user_location_permission_explanation,
            Toast.LENGTH_LONG
        )
            .show()
    }

    override fun onPermissionResult(granted: Boolean) {
        if (granted) {
            enableLocationComponent(mapboxMap?.style!!)
        } else {
            Toast.makeText(
                activity,
                com.innoventiq.arkbeh.R.string.user_location_permission_not_granted,
                Toast.LENGTH_LONG
            )
                .show()
        }
    }
    override fun onMapReady(mapboxMap: MapboxMap) {
        this.mapboxMap = mapboxMap

        mapboxMap.cameraPosition = CameraPosition.Builder()
            .target(myCurrentLocation)
            .zoom(14.0)
            .build()
        //mapView.setOnTouchListener { v, event -> true }
        mapboxMap.setStyle(Style.OUTDOORS) {
            enableLocationComponent(it)

        }

    }

    @SuppressLint("MissingPermission")
    private fun enableLocationComponent(loadedMapStyle: Style) {
        // Check if permissions are enabled and if not request
        if (PermissionsManager.areLocationPermissionsGranted(activity)) {


            // Create and customize the LocationComponent's options
            val customLocationComponentOptions = activity?.let {
                LocationComponentOptions.builder(it)
                    .trackingGesturesManagement(true)
                    .accuracyColor(
                        ContextCompat.getColor(
                            activity!!,
                            com.innoventiq.arkbeh.R.color.colorGreen
                        )
                    )
                    .build()

            }

            val locationComponentActivationOptions =
                activity?.let {
                    LocationComponentActivationOptions.builder(it, loadedMapStyle)
                        .locationComponentOptions(customLocationComponentOptions)
                        .build()
                }


            // Get an instance of the LocationComponent and then adjust its settings
            mapboxMap?.locationComponent?.apply {

                // Activate the LocationComponent with options
                locationComponentActivationOptions?.let {
                    this?.activateLocationComponent(
                        it
                    )
                }

                // Enable to make the LocationComponent visible
                isLocationComponentEnabled = true


                // Set the LocationComponent's camera mode
                cameraMode = CameraMode.TRACKING

                // Set the LocationComponent's render mode
                renderMode = RenderMode.COMPASS

            }
        } else {
            permissionsManager = PermissionsManager(this)
            permissionsManager.requestLocationPermissions(activity)
        }


    }

    private fun getMyLocation() {
        myCurrentLocation =
            mapboxMap?.locationComponent?.lastKnownLocation?.latitude?.let {
                mapboxMap!!.locationComponent.lastKnownLocation?.longitude?.let { it1 ->
                    LatLng(it,
                        it1
                    )
                }
            }
        println("the location : $myCurrentLocation ")
    }

    override fun onStart() {
        super.onStart()
        mapView.onStart()
    }

    override fun onResume() {
        super.onResume()
        mapView.onResume()
    }

    override fun onPause() {
        super.onPause()
        mapView.onPause()
    }

    override fun onStop() {
        super.onStop()
        mapView.onStop()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        mapView.onSaveInstanceState(outState)
    }

    override fun onDestroy() {
        super.onDestroy()
        mapView.onDestroy()
    }

    override fun onLowMemory() {
        super.onLowMemory()
        mapView.onLowMemory()
    }

    companion object {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private const val ARG_SECTION_NUMBER = "section_number"

        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        @JvmStatic
        fun newInstance(sectionNumber: Int): PlaceholderFragment {
            return PlaceholderFragment().apply {
                arguments = Bundle().apply {
                    putInt(ARG_SECTION_NUMBER, sectionNumber)
                }
            }
        }
    }
}

我几乎使用了完整的片段代码只是为了让您清楚地了解我用来获取位置的步骤。当谈到行 println("the location : $myCurrentLocation ")getMyLocation() 函数中,它 returns 这个输出 the location : null ,对此有什么帮助吗?

备注

加载地图时,它完美地显示了我的位置并进行了跟踪,但我就是无法获取它的 LatLng

我找到了答案,使用 LocationComponent.LocationEngine.getLastLocation 回调得到它,这里是代码:

    private fun getMyLocation() {
        mapboxMap?.locationComponent?.locationEngine?.getLastLocation(object :
            LocationEngineCallback<LocationEngineResult> {
            override fun onSuccess(result: LocationEngineResult?) {
                if (result != null) {
                    myCurrentLocation =
                        LatLng(result.locations[0].latitude, result.locations[0].longitude)
                    println("my location is : $myCurrentLocation")
                    getTheRoute(myCurrentLocation)
                }
            }

            override fun onFailure(exception: Exception) {
                toast(getString(R.string.failed_get_location))
            }

        })
    }