Android Mapbox运行时崩溃:以jni::PendingJavaException类型的未捕获异常终止
我在他们的网站上看到过类似的问题,但在一个新版本修复了这个问题后,他们就关闭了。我已经提出了一个错误,但尚未得到答复 这种崩溃几乎总是在包含地图的片段打开时发生(该片段包含一个viewpager,mapbox的片段托管在该viewpager中) 以下是我正在使用的唯一实现: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
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,应该在接下来的几天内