Android Mapbox运行时崩溃:以jni::PendingJavaException类型的未捕获异常终止

Android Mapbox运行时崩溃:以jni::PendingJavaException类型的未捕获异常终止,android,exception,runtime-error,mapbox,Android,Exception,Runtime Error,Mapbox,我在他们的网站上看到过类似的问题,但在一个新版本修复了这个问题后,他们就关闭了。我已经提出了一个错误,但尚未得到答复 这种崩溃几乎总是在包含地图的片段打开时发生(该片段包含一个viewpager,mapbox的片段托管在该viewpager中) 以下是我正在使用的唯一实现: implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:7.2.0' implementation 'com.mapbox.mapboxsdk:mapbox-andro

我在他们的网站上看到过类似的问题,但在一个新版本修复了这个问题后,他们就关闭了。我已经提出了一个错误,但尚未得到答复

这种崩溃几乎总是在包含地图的片段打开时发生(该片段包含一个viewpager,mapbox的片段托管在该viewpager中)

以下是我正在使用的唯一实现:

implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:7.2.0'
implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.5.0'
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-services:4.3.0'
这是完整的地图片段:

class ImageMapViewFragment : Fragment(), PermissionsListener {


    private lateinit var sharedViewModelForImage : SharedViewModelImage

    private lateinit var mapView: MapView
    private lateinit var map: MapboxMap
    private lateinit var permissionsManager: PermissionsManager

    override fun onAttach(context: Context) {
        super.onAttach(context)

        activity?.let {
            sharedViewModelForImage = ViewModelProviders.of(it).get(SharedViewModelImage::class.java)
        }
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Mapbox.getInstance(activity!!.applicationContext, getString(co.getdere.R.string.mapbox_access_token))
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? = inflater.inflate(co.getdere.R.layout.fragment_image_map_view, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mapView = view.findViewById(co.getdere.R.id.mapView)


        sharedViewModelForImage.sharedImageObject.observe(this, Observer {
            it?.let {image ->
                mapView.onCreate(savedInstanceState)
                mapView.getMapAsync { mapboxMap ->

                    mapboxMap.setStyle(Style.LIGHT) { it ->

                        map = mapboxMap

                        if (PermissionsManager.areLocationPermissionsGranted(this.context)) {

                            // Get an instance of the component
                            val locationComponent = mapboxMap.locationComponent

                            mapboxMap.addMarker(
                                MarkerOptions()
                                    .position(LatLng(image.location[0], image.location[1])))


                            val position = CameraPosition.Builder()
                                .target(LatLng(image.location[0], image.location[1]))
                                .zoom(10.0)
                                .build()

                            mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(position))


                            // Activate with options
                            if (ContextCompat.checkSelfPermission(
                                    this.context!!,
                                    Manifest.permission.ACCESS_FINE_LOCATION
                                ) == PackageManager.PERMISSION_GRANTED
                            ) {
                                locationComponent.activateLocationComponent(this.context!!, mapboxMap.style!!)
                            }

                            // Enable to make component visible
                            locationComponent.isLocationComponentEnabled = true

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


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


                    }
                }
            }
        }
        )
    }



    override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {
        Toast.makeText(this.context, "Location needed to use map", Toast.LENGTH_LONG).show()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }


    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 onLowMemory() {
        super.onLowMemory()
        mapView.onLowMemory()
    }

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

    companion object {
        fun newInstance(): ImageMapViewFragment = ImageMapViewFragment()
    }

}
类ImageMapViewFragment:Fragment(),PermissionsListener{
私有lateinit var sharedViewModelForImage:SharedViewModelImage
私有lateinit var mapView:mapView
私有lateinit变量映射:MapboxMap
私有lateinit var permissionsManager:permissionsManager
重写转速表(上下文:上下文){
super.onAttach(上下文)
活动?让我来{
sharedViewModelForImage=ViewModelProviders.of(it).get(SharedViewModelImage::class.java)
}
}
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
Mapbox.getInstance(activity!!.applicationContext,getString(co.getdere.R.string.Mapbox\u access\u token))
}
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):视图?=充气机。充气(co.getdere.R.layout.fragment\u image\u map\u视图,容器,false)
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
mapView=view.findViewById(co.getdere.R.id.mapView)
SharedViewModelForImageSharedImageObject.observe(这个,Observer{
它?让{image->
mapView.onCreate(savedInstanceState)
mapView.getMapAsync{mapboxMap->
mapboxMap.setStyle(Style.LIGHT){it->
map=mapboxMap
if(PermissionsManager.areLocationPermissionsGranted(this.context)){
//获取组件的实例
val locationComponent=mapboxMap.locationComponent
mapboxMap.addMarker(
标记选项()
.position(LatLng(image.location[0],image.location[1]))
val position=CameraPosition.Builder()
.target(LatLng(image.location[0],image.location[1]))
.zoom(10.0)
.build()
mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(位置))
//使用选项激活
if(ContextCompat.checkSelfPermission(
这个。上下文!!,
Manifest.permission.ACCESS\u FINE\u位置
)==已授予PackageManager.PERMISSION\u权限
) {
locationComponent.activateLocationComponent(this.context!!,mapboxMap.style!!)
}
//启用以使组件可见
locationComponent.isLocationComponentEnabled=true
//设置组件的渲染模式
locationComponent.renderMode=renderMode.COMPASS
}否则{
permissionsManager=permissionsManager(此)
permissionsManager.requestLocationPermissions(活动)
}
}
}
}
}
)
}
覆盖所需的解释(权限解释:可变列表?){
Toast.makeText(this.context,“需要使用地图的位置”,Toast.LENGTH\u LONG.show())
}
重写onRequestPermissionsResult(请求代码:Int,权限:Array,GrantResult:IntArray){
permissionsManager.onRequestPermissionsResult(请求代码、权限、GrantResult)
}
覆盖有趣的onStart(){
super.onStart()
mapView.onStart()
}
重写onResume(){
super.onResume()
onResume()文件
}
覆盖暂停(){
super.onPause()
mapView.onPause()
}
覆盖桌面上的乐趣(){
super.onStop()
mapView.onStop()
}
重写fun onLowMemory(){
super.onLowMemory()
mapView.onLowMemory()
}
重写onDestroyView(){
super.onDestroyView()
mapView.onDestroy()
}
伴星{
fun newInstance():ImageMapViewFragment=ImageMapViewFragment()
}
}

就其本身而言,这不是一个答案,但这看起来可能与此有关。我建议在7.3.0发布后升级到7.3.0,这应该在未来几天内完成。您在早期版本的SDK中看到过这个问题吗?另一件值得注意的事情是LocationLayer插件已被弃用-我建议阅读以了解更多关于n的信息ew LocationComponent类。免责声明:我在Mapbox工作。@samfader感谢你们的回复和你们正在构建的产品。我不得不说,也许我正试图在一个有问题的时间加入进来,因为有很多变化,但对于初学者来说,现在真的很难理解如何使用Mapbox。感觉就像文档一样标记无处不在且不一致。例如,我将阅读有关如何实现标记的文章,然后我将了解到它已被弃用(目前不知道仅在地图上放置一个标记的最直接方法是什么)。我希望一旦我真的想使用它,它会更容易理解。这本身不是一个答案,但这看起来可能与有关。我建议在它发布后升级到7.3.0,应该在接下来的几天内