Сбой во время выполнения Mapbox: завершается с необработанным исключением типа jni :: PendingJavaException - PullRequest
0 голосов
/ 22 марта 2019

Я видел похожие проблемы на их странице GitHub , но они были закрыты после того, как новая версия исправила эту проблему.Я поднял это как ошибку, но пока не получил ответа.

Этот сбой происходит почти всегда, когда открывается фрагмент, содержащий карту (фрагмент содержит панель просмотра и фрагмент 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()
    }

}
...