当shouldsimulate为false时,mapbox android导航正在崩溃
嗨,我想通过mapbox在android中启动一个导航 应用程序在我的手机上崩溃时当shouldsimulate为false时,mapbox android导航正在崩溃,android,navigation,mapbox,Android,Navigation,Mapbox,嗨,我想通过mapbox在android中启动一个导航 应用程序在我的手机上崩溃时 shouldSimulateRoute(false) 当它是真的时,它就起作用了 在模拟器中,应用程序正在重新路由,但什么也没有发生(箭头位于加利福尼亚州) 在手机上(使用apk),应用程序崩溃并重新启动,然后第二次崩溃并关闭应用程序 这是我使用的版本 implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.42.3' implem
shouldSimulateRoute(false)
当它是真的时,它就起作用了
在模拟器中,应用程序正在重新路由,但什么也没有发生(箭头位于加利福尼亚州)
在手机上(使用apk),应用程序崩溃并重新启动,然后第二次崩溃并关闭应用程序
这是我使用的版本
implementation 'com.mapbox.mapboxsdk:mapbox-android-navigation-ui:0.42.3'
implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:8.5.0'
这是我的密码
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.location.Location;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.AbsoluteSizeSpan;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.mapbox.api.directions.v5.models.BannerInstructions;
import com.mapbox.api.directions.v5.models.DirectionsResponse;
import com.mapbox.api.directions.v5.models.DirectionsRoute;
import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.services.android.navigation.ui.v5.NavigationView;
import com.mapbox.services.android.navigation.ui.v5.NavigationViewOptions;
import com.mapbox.services.android.navigation.ui.v5.OnNavigationReadyCallback;
import com.mapbox.services.android.navigation.ui.v5.listeners.BannerInstructionsListener;
import com.mapbox.services.android.navigation.ui.v5.listeners.InstructionListListener;
import com.mapbox.services.android.navigation.ui.v5.listeners.NavigationListener;
import com.mapbox.services.android.navigation.ui.v5.listeners.SpeechAnnouncementListener;
import com.mapbox.services.android.navigation.ui.v5.map.NavigationMapboxMap;
import com.mapbox.services.android.navigation.ui.v5.voice.SpeechAnnouncement;
import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;
import com.mapbox.services.android.navigation.v5.routeprogress.ProgressChangeListener;
import com.mapbox.services.android.navigation.v5.routeprogress.RouteProgress;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class HomeActivity extends AppCompatActivity implements OnNavigationReadyCallback,
NavigationListener, ProgressChangeListener, InstructionListListener, SpeechAnnouncementListener,
BannerInstructionsListener {
private static final Point ORIGIN = Point.fromLngLat(-77.03194990754128, 38.909664963450105);
private static final Point DESTINATION = Point.fromLngLat(-77.0270025730133, 38.91057077063121);
private static final int INITIAL_ZOOM = 16;
private NavigationView navigationView;
private View spacer;
private TextView speedWidget;
private String authKey;
private String missionId;
private Double lngOrigin;
private Double latOrigin;
private Double lngDest;
private Double latDest;
private static ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
private FloatingActionButton fabNightModeToggle;
private boolean bottomSheetVisible = true;
private boolean instructionListShown = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
setTheme(R.style.Theme_AppCompat_Light_NoActionBar);
initNightMode();
getCoordinates();
super.onCreate(savedInstanceState);
Mapbox.getInstance(this, "pk.eyJ1Ijoic2NobWVtNTUiLCJhIjoiY2syZDVjcGVmMDd2YzNpdGRrYWNneThxYSJ9.f0u1jB1HMxihXqAmHfVe7g");
setContentView(R.layout.activity_home);
navigationView = findViewById(R.id.navigationView);
fabNightModeToggle = findViewById(R.id.fabToggleNightMode);
speedWidget = findViewById(R.id.speed_limit);
spacer = findViewById(R.id.spacer);
setSpeedWidgetAnchor(R.id.summaryBottomSheet);
CameraPosition initialPosition = new CameraPosition.Builder()
.target(new LatLng(ORIGIN.latitude(),ORIGIN.longitude()))
.zoom(INITIAL_ZOOM)
.build();
navigationView.onCreate(savedInstanceState);
navigationView.initialize(this, initialPosition);
}
private void getCoordinates() {
Intent intent = getIntent();
lngOrigin = intent.getDoubleExtra("LONGITUDE_ORIGIN_POINT",0);
latOrigin = intent.getDoubleExtra("LATITUDE_ORIGIN_POINT",0);
lngDest = intent.getDoubleExtra("LONGITUDE_DESTINATION_POINT",0);
latDest = intent.getDoubleExtra("LATITUDE_DESTINATION_POINT",0);
}
@Override
public void onNavigationReady(boolean isRunning) {
// HomeActivity activity = new HomeActivity();
// Intent intent = getIntent();
// activity.missionId = missionId = intent.getStringExtra("MISSION_ID");
// activity.authKey = intent.getStringExtra("AUTHORIZATION_KEY");
// activity.latDest= intent.getDoubleExtra("LATITUDE_DESTINATION_POINT",0);
// activity.lngDest=intent.getDoubleExtra("LONGITUDE_DESTINATION_POINT",0);
// executorService.scheduleAtFixedRate(activity::postCoordinates, 10, 30, TimeUnit.SECONDS);
fetchRoute();
}
private void postCoordinates() {
NavigationMapboxMap map = navigationView.retrieveNavigationMapboxMap();
String userLat = String.valueOf(map.retrieveMap().getLocationComponent().getLastKnownLocation().getLatitude());
String userLng = String.valueOf(map.retrieveMap().getLocationComponent().getLastKnownLocation().getLongitude());
String data = "\t{\n" +
"\t\"mission_id\":"+missionId+",\n" +
"\t\"depart_lat\":"+userLat+",\n" +
"\t\"depart_lon\":"+userLng+",\n" +
"\t\"destination_lon\":"+lngDest+",\n" +
"\t\"destination_lat\":"+latDest+"\n" +
"\t}";
URL obj = null;
HttpURLConnection con = null;
try {
obj = new URL("https://some url");
con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setRequestProperty("Authorization", authKey);
}catch (IOException e) {
e.printStackTrace();
}
OutputStream os = null;
con.setDoOutput(true);
try {
os = con.getOutputStream();
os.write(data.getBytes());
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
int responseCode = 0;
try {
responseCode = con.getResponseCode();
} catch (IOException e) {
e.printStackTrace();
}
}
@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();
if (isFinishing()) {
saveNightModeToPreferences(AppCompatDelegate.MODE_NIGHT_AUTO);
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
}
}
@Override
public void onCancelNavigation() {
// Navigation canceled, finish the activity
finish();
}
public void finishNavigation (View v){
finish();
}
@Override
public void onNavigationFinished() {
// Intentionally empty
}
@Override
public void onNavigationRunning() {
// Intentionally empty
}
@Override
public void onProgressChange(Location location, RouteProgress routeProgress) {
setSpeed(location);
}
@Override
public void onInstructionListVisibilityChanged(boolean shown) {
instructionListShown = shown;
speedWidget.setVisibility(shown ? View.GONE : View.VISIBLE);
if (instructionListShown) {
fabNightModeToggle.hide();
} else if (bottomSheetVisible) {
fabNightModeToggle.show();
fabNightModeToggle.show();
}
}
@Override
public SpeechAnnouncement willVoice(SpeechAnnouncement announcement) {
return SpeechAnnouncement.builder().announcement("All announcements will be the same.").build();
}
@Override
public BannerInstructions willDisplay(BannerInstructions instructions) {
return instructions;
}
private void startNavigation(DirectionsRoute directionsRoute) {
NavigationViewOptions.Builder options =
NavigationViewOptions.builder()
.navigationListener(this)
.directionsRoute(directionsRoute)
.shouldSimulateRoute(false)
.progressChangeListener(this)
.instructionListListener(this)
.speechAnnouncementListener(this)
.bannerInstructionsListener(this);
setBottomSheetCallback(options);
setupNightModeFab();
navigationView.startNavigation(options.build());
}
private void fetchRoute() {
//Point origin = Point.fromLngLat(lngOrigin, latOrigin);
//Point destination = Point.fromLngLat(lngDest, latDest);
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) {
DirectionsRoute directionsRoute = response.body().routes().get(0);
startNavigation(directionsRoute);
}
@Override
public void onFailure(Call<DirectionsResponse> call, Throwable t) {
}
});
}
/**
* Sets the anchor of the spacer for the speed widget, thus setting the anchor for the speed widget
* (The speed widget is anchored to the spacer, which is there because padding between items and
* their anchors in CoordinatorLayouts is finicky.
*
* @param res resource for view of which to anchor the spacer
*/
private void setSpeedWidgetAnchor(@IdRes int res) {
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) spacer.getLayoutParams();
layoutParams.setAnchorId(res);
spacer.setLayoutParams(layoutParams);
}
private void setBottomSheetCallback(NavigationViewOptions.Builder options) {
options.bottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
switch (newState) {
case BottomSheetBehavior.STATE_HIDDEN:
bottomSheetVisible = false;
fabNightModeToggle.hide();
setSpeedWidgetAnchor(R.id.recenterBtn);
break;
case BottomSheetBehavior.STATE_EXPANDED:
bottomSheetVisible = true;
break;
case BottomSheetBehavior.STATE_SETTLING:
if (!bottomSheetVisible) {
// View needs to be anchored to the bottom sheet before it is finished expanding
// because of the animation
fabNightModeToggle.show();
setSpeedWidgetAnchor(R.id.summaryBottomSheet);
}
break;
default:
return;
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
});
}
private void setupNightModeFab() {
fabNightModeToggle.setOnClickListener(view -> toggleNightMode());
}
private void toggleNightMode() {
int currentNightMode = getCurrentNightMode();
alternateNightMode(currentNightMode);
}
private void initNightMode() {
int nightMode = retrieveNightModeFromPreferences();
AppCompatDelegate.setDefaultNightMode(nightMode);
}
private int getCurrentNightMode() {
return getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK;
}
private void alternateNightMode(int currentNightMode) {
int newNightMode;
if (currentNightMode == Configuration.UI_MODE_NIGHT_YES) {
newNightMode = AppCompatDelegate.MODE_NIGHT_NO;
} else {
newNightMode = AppCompatDelegate.MODE_NIGHT_YES;
}
saveNightModeToPreferences(newNightMode);
recreate();
}
private int retrieveNightModeFromPreferences() {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
return preferences.getInt(getString(R.string.current_night_mode), AppCompatDelegate.MODE_NIGHT_AUTO);
}
private void saveNightModeToPreferences(int nightMode) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt(getString(R.string.current_night_mode), nightMode);
editor.apply();
}
private void setSpeed(Location location) {
String string = String.format("%d\nMPH", (int) (location.getSpeed() * 2.2369));
int mphTextSize = getResources().getDimensionPixelSize(R.dimen.mph_text_size);
int speedTextSize = getResources().getDimensionPixelSize(R.dimen.speed_text_size);
SpannableString spannableString = new SpannableString(string);
spannableString.setSpan(new AbsoluteSizeSpan(mphTextSize),
string.length() - 4, string.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
spannableString.setSpan(new AbsoluteSizeSpan(speedTextSize),
0, string.length() - 3, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
speedWidget.setText(spannableString);
if (!instructionListShown) {
speedWidget.setVisibility(View.VISIBLE);
}
}
}
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.content.res.Configuration;
导入android.location.location;
导入android.os.Bundle;
导入android.preference.PreferenceManager;
导入android.text.SpannableString;
导入android.text.span;
导入android.text.style.AbsoluteSizeSpan;
导入android.view.view;
导入android.widget.TextView;
导入androidx.annotation.IdRes;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.appcompat.app.appcompat活动;
导入androidx.appcompat.app.AppCompatDelegate;
导入androidx.coordinatorlayout.widget.coordinatorlayout;
导入com.google.android.material.bottomsheet.BottomSheetBehavior;
导入com.google.android.material.floatingactionbutton.floatingactionbutton;
导入com.mapbox.api.directions.v5.models.banner说明;
导入com.mapbox.api.directions.v5.models.DirectionsResponse;
导入com.mapbox.api.directions.v5.models.DirectionsRoute;
导入com.mapbox.geojson.Point;
导入com.mapbox.mapboxsdk.mapbox;
导入com.mapbox.mapboxsdk.camera.CameraPosition;
导入com.mapbox.mapboxsdk.geometry.LatLng;
导入com.mapbox.services.android.navigation.ui.v5.NavigationView;
导入com.mapbox.services.android.navigation.ui.v5.NavigationViewOptions;
导入com.mapbox.services.android.navigation.ui.v5.OnNavigationReadyCallback;
导入com.mapbox.services.android.navigation.ui.v5.listeners.BannerInstructionsListener;
导入com.mapbox.services.android.navigation.ui.v5.listeners.InstructionListener;
导入com.mapbox.services.android.navigation.ui.v5.listeners.NavigationListener;
导入com.mapbox.services.android.navigation.ui.v5.listeners.SpeechAnnouncementListener;
导入com.mapbox.services.android.navigation.ui.v5.map.NavigationMapboxMap;
导入com.mapbox.services.android.navigation.ui.v5.voice.SpeechAnnouncement;
导入com.mapbox.services.android.navigation.v5.navigation.NavigationRoute;
导入com.mapbox.services.android.navigation.v5.routeprogress.ProgressChangeListener;
导入com.mapbox.services.android.navigation.v5.routeprogress.routeprogress;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.concurrent.Executors;
导入java.util.concurrent.ScheduledExecutorService;
导入java.util.concurrent.TimeUnit;
2.电话;;
2.回拨;
2.回应;;
公共类HomeActivity扩展了AppCompativeActivity实现OnNavigationReadyCallback,
NavigationListener、ProgressChangeListener、InstructionListener、SpeechAnnouncementListener、,
条幅说明{
专用静态终点原点=从LNGLAT的点(-77.03194990754128,38.909664963450105);
专用静态终点目的地=从LNGLAT出发的点(-77.0270025730133,38.910570706321);
私有静态最终int初始值_ZOOM=16;
私有导航视图导航视图;
私视间隔;
私有文本视图;
私有字符串身份验证密钥;
私有字符串任务ID;
私人双重国籍;
私人双重来源;
私人双重身份;
私人双Lattest;
私有静态ScheduledExecutorService executorService=Executors.newSingleThreadScheduledExecutor();
私有浮动操作按钮和模式切换;
私有布尔值=可见=真;
私有布尔指令ListShowed=false;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
setTheme(R.style.Theme\u AppCompat\u Light\u NoActionBar);
initNightMode();
获取坐标();
super.onCreate(savedInstanceState);
getInstance(这是“pk.eyj1ijoic2nobwvtntuilcjhijoi2syzdvjcgvmdd2yznpdgrywnnethxysj9.f0u1jB1HMxihXqAmHfVe7g”);
setContentView(R.layout.activity_home);
navigationView=findViewById(R.id.navigationView);
fabNightModeToggle=findViewById(R.id.fabToggleNightMode);
speedWidget=findViewById(R.id.speed\u limit);
间隔棒=findViewById(R.id.间隔棒);
设置速度WidgetAnchor(R.id.summaryBottomSheet);
CameraPosition initialPosition=新建CameraPosition.Builder()
.target(新LatLng(ORIGIN.latitude()、ORIGIN.longitude())
.zoom(初始缩放)
.build();
navigationView.onCreate(savedInstanceState);
navigationView.initialize(这个,initialPosition);
}
私有void getCoordinates(){
Intent=getIntent();
lngOrigin=intent.getDoubleExtra(“经度\原点\点”,0);
latOrigin=intent.getDoubleExtra(“纬度\原点\点”,0);
lngDest=intent.getDoubleExtra(“经度\目的地\点”,0);
latDest=intent.getDoubleExtra(“纬度\目的地\点”,0);
}
@凌驾
public void onNavigationReady(布尔值正在运行){
//HomeActivity活动=新的HomeActivity();
//Intent=getIntent();
//activity.missionId=missionId=intent.getStringExtra(“任务ID”);
//activity.authKey=intent.getStringExtra(“授权密钥”);
//activity.latDest=intent.getDoubleExtra(“纬度\目的地\点”,0);
//activity.lngDest=intent.getDoubleExtra(“经度\目的地\点”,0);
//executorService.scheduleAtFixedRate(活动::后协调,10,30,时间单位为秒);
fetchRoute();
}
私有空后协调(){
NavigationMapboxMap地图
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
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">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/button"
android:background="@drawable/btn_rounder_corner"
android:layout_width="90dp"
android:layout_height="45dp"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginBottom="80dp"
android:onClick="finishNavigation"
android:text="@string/button"
android:textColor="#ffffff" />
<com.mapbox.services.android.navigation.ui.v5.NavigationView
android:id="@+id/navigationView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_anchor="@+id/navigationView"
app:layout_anchorGravity="center"
app:navigationLightTheme="@style/MyCustomTheme"
app:navigationDarkTheme="@style/NavigationViewDark"
/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fabToggleNightMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|start"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:tint="@android:color/white"
app:layout_anchor="@id/spacer"
app:layout_anchorGravity="top|end"
/>
<TextView
android:id="@+id/speed_limit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_marginLeft="16dp"
android:background="@android:color/white"
android:elevation="3dp"
android:gravity="center"
android:padding="6dp"
android:textColor="@android:color/black"
android:textSize="35sp"
android:visibility="gone"
app:layout_anchor="@id/spacer"
app:layout_anchorGravity="top"/>
<View
android:id="@+id/spacer"
android:layout_width="wrap_content"
android:layout_height="6dp"
android:layout_gravity="top"
android:background="@android:color/transparent"
app:layout_anchorGravity="top"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>