使用 MapBox 启动 Navigation UI 导致意外崩溃

Using MapBox to start Navigation UI causes unexpected crash

我正在尝试按照此 MapBox 指南为我的应用程序实施导航组件:

https://docs.mapbox.com/help/tutorials/android-navigation-sdk/

当我尝试调用 .startNavigation(...) 时出现意外错误:

2020-03-08 19:51:45.786 11394-11394/com.example.mapboxnav A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8 in tid 11394 (mple.mapboxnav), pid 11394 (mple.mapboxnav)

由于我正在创建的应用程序具有许多按钮,因此我实现了 View.OnClickListener 并在用户按下导航按钮 (R.id.startNav) 时调用导航界面。但是,一旦用户按下按钮,应用程序就会崩溃。

currentRoute 正在工作并在调用 getRoute 时显示在地图上,就像 example 一样。我已经验证了 currentRoute 绝对不是 null。我也曾尝试在没有任何运气的情况下使用不同的坐标开始导航。

currentRoute 包含从用户的 current/last 已知位置到指定目的地的路线。作为参考,该行是 set/generated,方法如下:

public void initLine(Double lng, Double lat) {
        Location lastKnownLocation = mapboxMap.getLocationComponent().getLastKnownLocation();
        Point origin = Point.fromLngLat(lastKnownLocation.getLongitude(), lastKnownLocation.getLatitude());
        Point destination = Point.fromLngLat(lng, lat);
        getRoute(origin, destination);

    }

点击:

public void onClick(View v) {
        switch (v.getId()) {
            ...

            case R.id.startNav:

                boolean simulateRoute = true;

                NavigationLauncherOptions options = NavigationLauncherOptions.builder()
                        .directionsRoute(currentRoute)
                        .shouldSimulateRoute(simulateRoute)
                        .build();
                NavigationLauncher.startNavigation(MainActivity.this, options); // Causes Crash

        }
    }

嗯,很奇怪。我仍然觉得 logcat 中必须隐藏更多信息。也许远高于 Fatal signal 11 线?也许,只是也许,它与Location lastKnownLocation = mapboxMap.getLocationComponent().getLastKnownLocation();有关。为 lastKnownLocation 和 put

添加空检查
    Point origin = Point.fromLngLat(lastKnownLocation.getLongitude(), lastKnownLocation.getLatitude());
    Point destination = Point.fromLngLat(lng, lat);
    getRoute(origin, destination);

空检查块内部?

也许你用错了类?查看 Nav SDK 的 NavigationLauncher 测试应用程序 activity:https://github.com/mapbox/mapbox-navigation-android/blob/master/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/navigationui/NavigationLauncherActivity.java#L342-L347。它正在使用 NavigationLauncherOptions.Builder,而你没有。

https://github.com/mapbox/mapbox-navigation-android/blob/master/app/src/main/java/com/mapbox/services/android/navigation/testapp/activity/navigationui/NavigationLauncherActivity.java#L365

当您试图错误地访问内存或正在访问未分配给您使用的内存时,将引发 SIGSEGV 错误。有关详细信息,请参阅 What causes a SIGSEGV

其实错误发生在下面一行,

NavigationLauncher.startNavigation(MainActivity.this, options);

让我相信 NavigationLauncherOptions options 没有被正确分配并且可能 NULL 导致你取消对空指针的引用。

我知道这不是一个完美的答案,也不能真正为您的问题提供解决方案,但我希望它能帮助您更接近找到答案。

以下是一些可能有帮助的链接(包括文档): https://github.com/mapbox/mapbox-navigation-android/issues/1529 https://docs.mapbox.com/android/navigation/overview/

我花了两天半的时间才发现问题是我们需要在调用之前设置位置引擎:

NavigationLauncher.startNavigation(MainActivity.this, 选项);

因此您的代码应该如下所示并且应该可以工作:

NavigationLauncherOptions options = NavigationLauncherOptions.builder()
                            .directionsRoute(currentRoute)
                            .shouldSimulateRoute(simulateRoute)
                            .build();
    
    
// Just add these three lines
MapboxNavigation navigation = new MapboxNavigation(DriveActivity.this, getString(R.string. mapbox_access_token));
navigation.setLocationEngine(locationEngine);              mapboxMap.getLocationComponent().setLocationComponentEnabled(true);


NavigationLauncher.startNavigation(MainActivity.this, options);

告诉我进展如何

克里斯