Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Mapbox无法显示设备位置_Android_Mapbox_Android Location_Mapbox Gl_Mapbox Android - Fatal编程技术网

Android Mapbox无法显示设备位置

Android Mapbox无法显示设备位置,android,mapbox,android-location,mapbox-gl,mapbox-android,Android,Mapbox,Android Location,Mapbox Gl,Mapbox Android,我有一个带有Mapbox的片段,我想在上面显示设备的位置 class SampleMapFragment : Fragment(), PermissionsListener { private lateinit var binding: FragmentExploreBinding @Inject lateinit var permissionsManager: PermissionsManager private lateinit var mapboxMa

我有一个带有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()
    }
}
class SampleMapFragment:Fragment(),PermissionsListener{
私有lateinit变量绑定:FragmentExplorerBinding
@注入
lateinit var permissionsManager:permissionsManager
私有lateinit var mapboxMap:mapboxMap
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
getInstance(requireContext().applicationContext,getString(R.string.Mapbox\u标记))
}
覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看{
if(!::binding.i初始化){
绑定=数据绑定直到。充气(
充气机,
R.layou.fragment_探索,
集装箱,
假的
)
binding.lifecycleOwner=此
binding.mapView.onCreate(savedInstanceState)
setUpMap()
}
返回binding.root
}
私人娱乐设置地图(){
binding.mapView.getMapAsync{mapboxMap->
this.mapboxMap=mapboxMap
mapboxMap.setStyle(Style.MAPBOX_STREETS){loadedMapStyle->
starLocationTracking(loadedMapStyle)
}
}
}
私人娱乐starLocationTracking(loadedMapStyle:Style){
如果(!PermissionsManager.areLocationPermissionsGranted(requireContext())){
permissionsManager.requestLocationPermissions(requireResponsibility())
返回
}
initLocationComponent(loadedMapStyle)
}
private fun initLocationComponent(loadedMapStyle:Style){
val customLocationComponentOptions=LocationComponentOptions.builder(requirectivity())
.立面图(5f)
.accuracyAlpha(.6f)
.准确度颜色(颜色.红色)
.build()
val locationComponentActivationOptions=locationComponentActivationOptions.builder(
要求(),
装载式
)
.locationComponentOptions(customLocationComponentOptions)
.build()
mapboxMap.locationComponent.apply{
激活定位组件(位置组件激活选项)
isLocationComponentEnabled=true
renderMode=renderMode.COMPASS
cameraMode=cameraMode.TRACKING
}
}
覆盖所需的解释(权限解释:可变列表?){
//TODO此处可以显示一些说明
}
重写onPermissionResult(已授予:布尔值){
如果(授予)mapboxMap.getStyle{loadedStyle->starLocationTracking(loadedStyle)}
//其他要做的事情可以在这里给出一些解释
}
fun onMapBoxRequestPermissionsResult(
请求代码:Int,
权限:数组,
格兰特结果:因塔雷
)=permissionsManager.onRequestPermissionsResult(请求代码、权限、GrantResult)
覆盖有趣的onStart(){
super.onStart()
binding.mapView.onStart()
}
重写onResume(){
super.onResume()
binding.mapView.onResume()
}
覆盖暂停(){
super.onPause()
binding.mapView.onPause()
}
覆盖桌面上的乐趣(){
super.onStop()
binding.mapView.onStop()
}
重写onDestroy(){
super.ondestory()
releaseMapResources()
releasePermissionsManagerListener()
}
私人娱乐发布地图资源(){
binding.mapView.onDestroy()
}
私人娱乐发布许可证管理员(){
permissionsManager.listener=null
}
覆盖存储实例状态(超出状态:捆绑){
super.onSaveInstanceState(超出状态)
binding.mapView.onSaveInstanceState(outState)
}
重写fun onLowMemory(){
super.onLowMemory()
binding.mapView.onLowMemory()
}
}
我用2个真实设备和1个模拟器测试了上述实现。 该解决方案在安卓10设备上运行良好。找到用户位置,即使在关闭位置服务并在地图可见后再次打开位置服务

但有时找不到位置,有时需要很长时间,甚至在尝试使用Android 9和Android 7设备时,位置服务在地图可见之前就准备好了

这里有什么问题?任何帮助都将不胜感激

“但有时找不到位置,有时需要很长时间, 即使是位置服务在地图显示之前就已经准备好了 尝试使用Android 9和Android 7设备。”

这听起来好像设备试图从GPS传感器获取位置,但需要很长时间才能检索到。随着更新的设备和安卓10的本地化得到了改进,所以这可以解释你看到了什么

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

此外,请检查您使用Android 10获得的“快速”位置是否实际从GPS传感器中检索到,或者它是否“只是”由Android缓存的最后一个已知位置