Mapbox无法显示设备位置

问题描述 投票:0回答:1

我有一个带有Mapbox的片段,我想在上面显示设备位置。

class SampleMapFragment : Fragment(), PermissionsListener {

    private lateinit var binding: FragmentExploreBinding

    @Inject
    lateinit var permissionsManager: PermissionsManager

    private lateinit var mapboxMap: MapboxMap

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Mapbox.getInstance(requireContext().applicationContext, getString(R.string.mapbox_token))
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        if (!::binding.isInitialized) {
            binding = DataBindingUtil.inflate(
                inflater,
                R.layout.fragment_explore,
                container,
                false
            )

            binding.lifecycleOwner = this

            binding.mapView.onCreate(savedInstanceState)
            setUpMap()
        }

        return binding.root
    }

    private fun setUpMap() {
        binding.mapView.getMapAsync { mapboxMap ->
            this.mapboxMap = mapboxMap
            mapboxMap.setStyle(Style.MAPBOX_STREETS) { loadedMapStyle ->
                starLocationTracking(loadedMapStyle)
            }
        }
    }

    private fun starLocationTracking(loadedMapStyle: Style) {
        if (!PermissionsManager.areLocationPermissionsGranted(requireContext())) {
            permissionsManager.requestLocationPermissions(requireActivity())
            return
        }

        initLocationComponent(loadedMapStyle)
    }

    private fun initLocationComponent(loadedMapStyle: Style) {

        val customLocationComponentOptions = LocationComponentOptions.builder(requireActivity())
            .elevation(5f)
            .accuracyAlpha(.6f)
            .accuracyColor(Color.RED)
            .build()

        val locationComponentActivationOptions = LocationComponentActivationOptions.builder(
            requireActivity(),
            loadedMapStyle
        )
            .locationComponentOptions(customLocationComponentOptions)
            .build()

        mapboxMap.locationComponent.apply {
            activateLocationComponent(locationComponentActivationOptions)
            isLocationComponentEnabled = true
            renderMode = RenderMode.COMPASS
            cameraMode = CameraMode.TRACKING
        }
    }

    override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {
        // TODO some explanation can be shown here
    }

    override fun onPermissionResult(granted: Boolean) {
        if (granted) mapboxMap.getStyle { loadedStyle -> starLocationTracking(loadedStyle) }
        //else TODO some explanation can be shown here
    }

    fun onMapBoxRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) = permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults)

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

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

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

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

    override fun onDestroy() {
        super.onDestroy()
        releaseMapResources()
        releasePermissionsManagerListener()
    }

    private fun releaseMapResources() {
        binding.mapView.onDestroy()
    }

    private fun releasePermissionsManagerListener() {
        permissionsManager.listener = null
    }

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

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

我用2个真实设备和1个仿真器测试了上面的实现。该解决方案可以在Android 10设备上正常运行。即使在关闭位置服务并在地图后再次将其打开之后,仍可以找到用户位置。

但是有时无法找到位置,有时会花费很长时间,甚至在尝试使用Android 9和Android 7设备时,即使位置服务已准备就绪,地图才可见。

这里可能是什么问题?任何帮助,将不胜感激。

android mapbox android-location mapbox-gl mapbox-android
1个回答
0
投票

“但是有时找不到位置,有时需要很长时间,在地图可见之前,即使位置服务也已准备就绪,尝试使用Android 9和Android 7设备。“

听起来好像设备试图从GPS传感器获取位置,但是要花很长时间才能检索到它。随着更新的设备和Android 10的本地化得到了改善,因此这可以解释您看到的内容。

为了了解发生了什么,我建议实现Android FusedLocationProvider并将其行为与Mapbox SDK(locationComponent)包装的行为进行比较。

[另外,请检查您从Android 10获得的“ snappy”位置是否实际上是从GPS传感器中检索出来的,或者它是否“仅”是Android缓存的最后一个已知位置。

© www.soinside.com 2019 - 2024. All rights reserved.