带有useroffroute MapBox Android的NavigationView

问题描述 投票:0回答:1

我实际上正在尝试使用useroffroute函数,但是它不起作用,我看到了另一个post,它对NavigationView说,只有我不知道该怎么做。我目前正在使用此代码来检测用户是否已离开路线,但他没有调用useroffroute函数。我正在尝试做的是,当用户离开路线时,他会为该用户触发Toast,但不幸的是我没有成功。

public class mapbox extends AppCompatActivity{

private MapView mapView;
Button button;
private static final String TAG = "resultados";

private MapboxNavigation navigation;

private boolean running;

private NavigationMapboxMap map;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Mapbox.getInstance(this, getString(R.string.mapbox_access_token));
    setContentView(R.layout.activity_mapbox);

    button = findViewById(R.id.button);

    MapboxNavigationOptions options = MapboxNavigationOptions.builder().isDebugLoggingEnabled(true).build();
    navigation = new MapboxNavigation(getApplicationContext(), getString(R.string.mapbox_access_token), options);

     /*
    navigation.addOffRouteListener(new OffRouteListener() {
        @Override
        public void userOffRoute(Location location) {
            Toast.makeText(getApplicationContext(), "Off route detected.........",        Toast.LENGTH_SHORT).show();
            // Make sure you call for a new DirectionsRoute object
            // and end by calling MapboxNavigation#startNavigation on a successful
        }
    });

     */


     /*
    mapView = (MapView) findViewById(R.id.mapView);
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(@NonNull MapboxMap mapboxMap) {

            mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {
                @Override
                public void onStyleLoaded(@NonNull Style style) {

                    // Map is set up and the style has loaded. Now you can add data or make other map adjustments


                }
            });

        }
    });

   */

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // From Mapbox to The White House
            Point origin = Point.fromLngLat(-38.62882018, -3.78666528);
            Point destination = Point.fromLngLat(-38.56038094, -3.7337361F);

            NavigationRoute.builder(mapbox.this)
                    .accessToken(getString(R.string.mapbox_access_token))
                    .origin(origin)
                    .destination(destination)
                    .build()
                    .getRoute(new Callback<DirectionsResponse>() {
                        @Override
                        public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
                            Log.i(TAG, response+"");

                 // Route fetched from NavigationRoute

                            DirectionsRoute route = response.body().routes().get(0);

                 // Create a NavigationLauncherOptions object to package everything together
                            NavigationLauncherOptions options =   NavigationLauncherOptions.builder()
                                    .directionsRoute(route)
                                    .shouldSimulateRoute(false)
                                    .build();

                 // Call this method with Context from within an Activity
                            NavigationLauncher.startNavigation(mapbox.this, options);



                        }


                        @Override
                        public void onFailure(Call<DirectionsResponse> call, Throwable t) {

                        }
                    });
        }
});
}

@Override
protected void onStart() {
    super.onStart();
    //mapView.onStart();
}

@Override
protected void onResume() {
    super.onResume();
    //mapView.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    //mapView.onPause();
}

@Override
protected void onStop() {
    super.onStop();
    //mapView.onStop();
}

@Override
public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
    //mapView.onSaveInstanceState(outState);
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    //mapView.onLowMemory();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //mapView.onDestroy();
}

 }
java android navigation maps mapbox
1个回答
0
投票

经过数小时的寻找解决方案,我终于找到了一个。您必须使用NavigationViewer来获取应用程序传递的参数,以便您可以侦听用户是否离开路线。这是一个例子:

public class last extends AppCompatActivity implements   OnNavigationReadyCallback,
    NavigationListener, RouteListener, ProgressChangeListener {

private NavigationView navigationView;
private boolean dropoffDialogShown;
private Location lastKnownLocation;

private List<Point> points = new ArrayList<>();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    Mapbox.getInstance(this, getString(R.string.mapbox_access_token));
    setTheme(R.style.Theme_AppCompat_NoActionBar);
    super.onCreate(savedInstanceState);
    points.add(Point.fromLngLat(-38.62882018, -3.78666528));
    points.add(Point.fromLngLat(-38.56038094, -3.7337361));
    setContentView(R.layout.activity_last);
    navigationView = findViewById(R.id.navigationView);
    navigationView.onCreate(savedInstanceState);
    navigationView.initialize(this);
}

@Override
public void onStart() {
    super.onStart();
    navigationView.onStart();
}

@Override
public void onResume() {
    super.onResume();
    navigationView.onResume();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    navigationView.onLowMemory();
}

@Override
public void onBackPressed() {
    // If the navigation view didn't need to do anything, call super
    if (!navigationView.onBackPressed()) {
        super.onBackPressed();
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    navigationView.onSaveInstanceState(outState);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    navigationView.onRestoreInstanceState(savedInstanceState);
}

@Override
public void onPause() {
    super.onPause();
    navigationView.onPause();
}

@Override
public void onStop() {
    super.onStop();
    navigationView.onStop();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    navigationView.onDestroy();
}

@Override
public void onNavigationReady(boolean isRunning) {
    fetchRoute(points.remove(0), points.remove(0));
}

@Override
public void onCancelNavigation() {
    // Navigation canceled, finish the activity
    finish();
}

@Override
public void onNavigationFinished() {
    // Intentionally empty
}

@Override
public void onNavigationRunning() {
    // Intentionally empty
}

@Override
public boolean allowRerouteFrom(Point offRoutePoint) {
    return true;
}

@Override
public void onOffRoute(Point offRoutePoint) {
    Toast.makeText(this, "Off route", Toast.LENGTH_SHORT).show();

}

@Override
public void onRerouteAlong(DirectionsRoute directionsRoute) {

}

@Override
public void onFailedReroute(String errorMessage) {

}

@Override
public void onArrival() {
    if (!dropoffDialogShown && !points.isEmpty()) {
        showDropoffDialog();
        dropoffDialogShown = true; // Accounts for multiple arrival events
        Toast.makeText(this, "You have arrived!", Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onProgressChange(Location location, RouteProgress routeProgress) {
    lastKnownLocation = location;
}

private void startNavigation(DirectionsRoute directionsRoute) {
    NavigationViewOptions navigationViewOptions = setupOptions(directionsRoute);
    navigationView.startNavigation(navigationViewOptions);
}

private void showDropoffDialog() {
    AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    alertDialog.setMessage(getString(R.string.dropoff_dialog_text));
    alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, getString(R.string.dropoff_dialog_positive_text),
            (dialogInterface, in) -> fetchRoute(getLastKnownLocation(), points.remove(0)));
    alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.dropoff_dialog_negative_text),
            (dialogInterface, in) -> {
                // Do nothing
            });

    alertDialog.show();
}

private void fetchRoute(Point origin, Point destination) {
    NavigationRoute.builder(this)
            .accessToken(Mapbox.getAccessToken())
            .origin(origin)
            .destination(destination)
            .alternatives(true)
            .build()
            .getRoute(new Callback<DirectionsResponse>() {
                @Override
                public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
                    DirectionsResponse directionsResponse = response.body();
                    if (directionsResponse != null && !directionsResponse.routes().isEmpty()) {
                        startNavigation(directionsResponse.routes().get(0));
                    }
                }

                @Override
                public void onFailure(Call<DirectionsResponse> call, Throwable t) {

                }
            });
}

private NavigationViewOptions setupOptions(DirectionsRoute directionsRoute) {
    dropoffDialogShown = false;

    NavigationViewOptions.Builder options = NavigationViewOptions.builder();
    options.directionsRoute(directionsRoute)
            .navigationListener(this)
            .progressChangeListener(this)
            .routeListener(this)
            .shouldSimulateRoute(false);
    return options.build();
}

private Point getLastKnownLocation() {
    return Point.fromLngLat(lastKnownLocation.getLongitude(), lastKnownLocation.getLatitude());
}

}

XML文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.mapbox.services.android.navigation.ui.v5.NavigationView
    android:id="@+id/navigationView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:navigationLightTheme="@style/NavigationViewLight"
    app:navigationDarkTheme="@style/NavigationViewDark"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>

 </androidx.constraintlayout.widget.ConstraintLayout>
© www.soinside.com 2019 - 2024. All rights reserved.