Android 具有自定义瓷砖集或样式的Mapbox NavigationView

Android 具有自定义瓷砖集或样式的Mapbox NavigationView,android,mapbox,navigationview,Android,Mapbox,Navigationview,如何向NavigationView添加一个tileset 我的第一次尝试是使用Mapbox Studio创建一个完整的样式,并将一个瓷砖集链接到它。然后我将样式添加到片段内部的NavigationView中 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { [...] // Mapbox naviga

如何向NavigationView添加一个tileset

我的第一次尝试是使用Mapbox Studio创建一个完整的样式,并将一个瓷砖集链接到它。然后我将样式添加到片段内部的NavigationView中

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    [...]

    // Mapbox
    navigationView = view.findViewById(R.id.mapboxNavigationView);
    navigationView.onCreate(null);

    [...]

    navigationView.initialize(this, initialPosition);

    return view;
}



@SuppressLint("MissingPermission")
@Override
public void onNavigationReady(boolean isRunning) {
    mapboxMap = navigationView.retrieveNavigationMapboxMap().retrieveMap();

    mapboxMap.setStyle("mySecretStyle", new Style.OnStyleLoaded() {
        @Override
        public void onStyleLoaded(@NonNull Style style) {
            // Never called ...
        }
    });
}
如您在此处所见,样式已成功添加

但是出现以下错误,并且没有导航启动

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.util.List com.mapbox.mapboxsdk.maps.Style.getSources() 位于com.mapbox.services.android.navigation.ui.v5.map.NavigationMapboxMap.initializeWayName(NavigationMapboxMap.java:668) 位于com.mapbox.services.android.navigation.ui.v5.map.NavigationMapboxMap.addProgressChangeListener(NavigationMapboxMap.java:277) 在com.mapbox.services.android.navigation.ui.v5.NavigationView.initializeNavigationListeners(NavigationView.java:691)上 在com.mapbox.services.android.navigation.ui.v5.NavigationView.initializeNavigation(NavigationView.java:632)上 位于com.mapbox.services.android.navigation.ui.v5.NavigationView.startNavigation(NavigationView.java:394)

我的第二种方法是只添加一个tileset,上传到Mapbox Studio:

@Override
public void onNavigationReady(boolean isRunning) {
    mapboxMap = navigationView.retrieveNavigationMapboxMap().retrieveMap();

    mapboxMap.getStyle(new Style.OnStyleLoaded() {
        @Override
        public void onStyleLoaded(@NonNull Style style) {   
            String sourceId = "indoor-source";
            style.addSource(new RasterSource(sourceId, "mytileid"));
            String layerId = "indoor-layer";
            RasterLayer rasterLayer = new RasterLayer(layerId, sourceId);
            style.addLayer(rasterLayer);
        }
    });
}
但这也不起作用——但至少导航是以默认的导航样式运行的

我的第三次尝试(使用有效的样式)

…生成SIGSEGV

---------碰撞开始2020-02-28 15:49:32.835 A/libc:致命信号11(SIGSEGV),代码1(SEGV_-MAPERR),故障地址0x681713e80325b4 在tid 29828(oid.med…)中,pid 29828(oid.med…)

有什么想法吗

  • 我看到了
    mapboxMap.setStyle(“mySecretStyle”),而不是
    mySecretStyle
    。你只是通过你的样式id而不是那里的
    mySecretStyle
    ?如果是这样,你应该使用
    new style.Builder().fromUri()
  • 您的瓷砖集是否来自Mapbox瓷砖集API?如果是:

    • 确保瓷砖集是公共的。您可以通过Mapbox Studio设置此公共

    • 您正在代码中使用
      VectorSource
      。显示Mapbox演示应用中的
      VectorSource
      用法。演示应用示例也位于

  • 如果您使用的是
    光栅源
    ,请参阅演示应用程序中的
    光栅源
    用法。可能是您错误地初始化了各种源对象


  • 一般来说,如果你能解释一下你想添加什么类型的数据,我可能会进一步帮助你。你也可以在Mapbox Studio中将你想要的数据添加到样式中,而不是在设备上的运行时。然后,你所要做的就是加载样式。

    嘿,langsmith,我使用了RasterSource。但我的错误是没有添加“Mapbox://”在我的tileset ID之前,wich是私人的。非常感谢您的回答!
    @Override
    public void onNavigationRunning() {
        navigationView.retrieveNavigationMapboxMap().retrieveMap().setStyle("mySecretStyle");
    }
    
    mapboxMap.setStyle(new Style.Builder().fromUri("styleIdHere"), new Style.OnStyleLoaded() {
              @Override
              public void onStyleLoaded(@NonNull Style style) {
    
    
              }
            });