簡體   English   中英

NavigationView 與 useroffroute MapBox Android

[英]NavigationView with useroffroute MapBox Android

我實際上正在嘗試使用useroffroute function 但它不起作用,我看到了另一個帖子,它對NavigationView說,只是我不知道該怎么做。 我目前正在使用此代碼來檢測用戶是否離開了路線,但他沒有調用useroffroute function。 我想要做的是,當用戶離開路線時,他會為用戶觸發一個 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();
}

 }

經過幾個小時尋找解決方案,我終於找到了一個。 您必須使用 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>

當我使用多個航點開始導航時,導航在到達第一個航點后停止。 請提出更改建議。`

       try{
        NavigationRoute.Builder builder = NavigationRoute.builder(this)
                .accessToken("pk." + getString(R.string.gh_key))
                .baseUrl(getString(R.string.base_url))
                .user("gh")
                .alternatives(true);

            Location lastKnownLocation = new Location(LocationManager.GPS_PROVIDER);
            lastKnownLocation.setLatitude(Double.parseDouble(SharePref.getInstance(MapBoxNavActivity.this).getJavaRXPref(getString(R.string.latitude))));
            lastKnownLocation.setLongitude(Double.parseDouble(SharePref.getInstance(MapBoxNavActivity.this).getJavaRXPref(getString(R.string.longitude))));
                Point location = Point.fromLngLat(lastKnownLocation.getLongitude(), lastKnownLocation.getLatitude());
                if (lastKnownLocation.hasBearing()){
                    // 90 seems to be the default tolerance of the SDK
                    builder.origin(location, (double) lastKnownLocation.getBearing(), 90.0);
                }
                else{
                    builder.origin(location);
                }

        try {
            if(waypoints.size()>0){
                for (int i = 0; i < waypoints.size(); i++) {
                    Point p = waypoints.get(i);
                    if (i < waypoints.size() - 1) {
                        try {
                            builder.addWaypoint(p);
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    } else {
                        builder.destination(p);
                    }
                }

            }


        }catch (Exception se){
            se.printStackTrace();
        }

        builder.build().getRoute(new SimplifiedCallback() {
            @Override
            public void onResponse(Call<DirectionsResponse> call, Response<DirectionsResponse> response) {
                if (validRouteResponse(response)) {
                    route = response.body().routes().get(0);
                    try {
                        MapboxNavigationOptions.Builder navigationOptions = MapboxNavigationOptions.builder();
                        NavigationViewOptions.Builder options = NavigationViewOptions.builder();
                        options.navigationListener(MapBoxNavActivity.this);
                        options.directionsRoute(route);
                        options.shouldSimulateRoute(false);
                        options.directionsProfile(DirectionsCriteria.PROFILE_DRIVING_TRAFFIC);
                        navigationOptions.enableOffRouteDetection(true);
                        navigationOptions.snapToRoute(true);
                        options.navigationOptions(navigationOptions.build());
                        navigationView.startNavigation(options.build());
                       
                    }catch (Exception e){
                        e.printStackTrace();
                    }

                } 

            }

            @Override
            public void onFailure(Call<DirectionsResponse> call, Throwable throwable) {
                super.onFailure(call, throwable);
                Log.i("Fetch route error",throwable.getMessage());
            }
        });
        }

    }
    catch ( Exception se){
        se.printStackTrace();
    }

}

`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM