diff --git a/.idea/misc.xml b/.idea/misc.xml
index cd77a1f062..21e99e2dc0 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -4,7 +4,7 @@
-
+
\ No newline at end of file
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
index c796d9134a..ae7aef62c8 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapWrapper.java
@@ -4,7 +4,6 @@ import android.content.Context;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
-import com.amap.api.maps.LocationSource;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.Polyline;
@@ -14,7 +13,6 @@ import com.mogo.map.IMogoMap;
import com.mogo.map.IMogoUiSettings;
import com.mogo.map.impl.amap.marker.AMapInfoWindowAdapter;
import com.mogo.map.impl.amap.marker.AMapMarkerWrapper;
-import com.mogo.map.impl.amap.navi.NaviClient;
import com.mogo.map.impl.amap.overlay.AMapPolylineWrapper;
import com.mogo.map.impl.amap.uicontroller.AMapUIController;
import com.mogo.map.impl.amap.utils.ObjectUtils;
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java
index 963a177155..0a85cd595d 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java
@@ -9,6 +9,7 @@ import com.amap.api.maps.model.Polyline;
import com.amap.api.navi.AMapNavi;
import com.amap.api.navi.enums.AimLessMode;
import com.amap.api.navi.enums.NaviType;
+import com.amap.api.navi.model.AMapNaviPath;
import com.amap.api.navi.model.NaviLatLng;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.debug.DebugConfig;
@@ -30,6 +31,7 @@ import com.mogo.utils.storage.SharedPrefsMgr;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
/**
* @author congtaowang
@@ -48,10 +50,9 @@ public class NaviClient implements IMogoNavi {
private final Context mContext;
private AMapNavi mAMapNavi;
- private final NaviListenerAdapter mAMapNaviListener;
+ private NaviListenerAdapter mAMapNaviListener;
-
- private final AimlessModeListenerAdapter mAimlessModeListener;
+ private AimlessModeListenerAdapter mAimlessModeListener;
/**
* 导航策略配置
@@ -77,10 +78,23 @@ public class NaviClient implements IMogoNavi {
private NaviClient( Context context ) {
mContext = context;
- mAMapNavi = AMapNavi.getInstance( context );
+ if ( DebugConfig.isUseCustomNavi() ) {
+ // 按需初始化导航组件
+ initAMapNavi();
+ }
+ }
+
+ /**
+ * 初始化导航组件
+ */
+ private void initAMapNavi() {
+ if ( mAMapNavi != null ) {
+ return;
+ }
+ mAMapNavi = AMapNavi.getInstance( mContext );
mAMapNavi.setEmulatorNaviSpeed( 120 );
- mAMapNavi.setUseInnerVoice( DebugConfig.isUseCustomNavi(), true );
- mAMapNaviListener = new NaviListenerAdapter( context, mAMapNavi, this );
+ mAMapNavi.setUseInnerVoice( DebugConfig.isUseCustomNavi(), false );
+ mAMapNaviListener = new NaviListenerAdapter( mContext, this );
mAimlessModeListener = new AimlessModeListenerAdapter() {
};
mAMapNavi.addAMapNaviListener( mAMapNaviListener );
@@ -165,10 +179,28 @@ public class NaviClient implements IMogoNavi {
}
}
+ public void stopAMapNavi() {
+ if ( mAMapNavi != null ) {
+ mAMapNavi.stopNavi();
+ }
+ }
+
+ public void selectAMapRouteId( int routeId ) {
+ if ( mAMapNavi != null ) {
+ mAMapNavi.selectRouteId( routeId );
+ }
+ }
+
+ public Map< Integer, AMapNaviPath > getAMapNaviPaths() {
+ if ( mAMapNavi != null ) {
+ return mAMapNavi.getNaviPaths();
+ }
+ return null;
+ }
@Override
public void startNavi( boolean isRealNavi ) {
- if ( mAMapNaviListener.isStopped() ) {
+ if ( mAMapNaviListener != null && mAMapNaviListener.isStopped() ) {
return;
}
mIsRealNavi = isRealNavi;
@@ -243,6 +275,9 @@ public class NaviClient implements IMogoNavi {
@Override
public boolean setBroadcastMode( int mode ) {
+ if ( checkAMapNavi() ) {
+ return false;
+ }
return mAMapNavi.setBroadcastMode( mode );
}
@@ -300,6 +335,9 @@ public class NaviClient implements IMogoNavi {
@Override
public void startAimlessMode() {
+ if ( checkAMapNavi() ) {
+ return;
+ }
if ( mAimlessModeStatus && !isNaviing() ) {
mAMapNavi.startAimlessMode( AimLessMode.CAMERA_AND_SPECIALROAD_DETECTED );
mAimlessStatus = true;
@@ -312,6 +350,9 @@ public class NaviClient implements IMogoNavi {
@Override
public void stopAimlessMode() {
+ if ( checkAMapNavi() ) {
+ return;
+ }
mAMapNavi.stopAimlessMode();
mAimlessStatus = false;
Logger.d( TAG, "关闭巡航成功" );
@@ -341,6 +382,15 @@ public class NaviClient implements IMogoNavi {
@Override
public void setUseExtraGPSData( boolean use ) {
+ // 如果使用平台模拟位置变化,需要用到导航组件
+ if ( use ) {
+ initAMapNavi();
+ } else {
+ destroyAMapNavi();
+ }
+ if ( checkAMapNavi() ) {
+ return;
+ }
Logger.d( TAG, "设置外部gps源状态 %s", use );
mAMapNavi.setIsUseExtraGPSData( use );
if ( AMapWrapper.getAMap() == null ) {
@@ -364,8 +414,22 @@ public class NaviClient implements IMogoNavi {
AMapWrapper.getAMap().setMyLocationEnabled( true );
}
+ /**
+ * 销毁导航组件
+ */
+ private void destroyAMapNavi() {
+ if ( mAMapNavi != null ) {
+ mAMapNavi.removeAMapNaviListener( mAMapNaviListener );
+ mAMapNavi.removeAimlessModeListener( mAimlessModeListener );
+ mAMapNavi.destroy();
+ }
+ }
+
@Override
public void setExtraGPSData( double lon, double lat, float speed, float accuracy, float bearing, long timestamp ) {
+ if ( checkAMapNavi() ) {
+ return;
+ }
if ( !mAMapNavi.getIsUseExtraGPSData() ) {
Logger.d( TAG, "拒绝外部GPS数据" );
return;
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java
index 96578329ed..9aa69c5daa 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java
@@ -6,15 +6,10 @@ import android.os.Trace;
import android.text.TextUtils;
import com.amap.api.maps.model.Polyline;
-import com.amap.api.navi.AMapNavi;
-import com.amap.api.navi.AimlessModeListener;
-import com.amap.api.navi.enums.AimLessMode;
import com.amap.api.navi.enums.CameraType;
-import com.amap.api.navi.enums.CarEnterCameraStatus;
import com.amap.api.navi.enums.NaviType;
import com.amap.api.navi.model.AMapCalcRouteResult;
import com.amap.api.navi.model.AMapNaviCameraInfo;
-import com.amap.api.navi.model.AMapNaviInfo;
import com.amap.api.navi.model.AMapNaviLocation;
import com.amap.api.navi.model.NaviInfo;
import com.mogo.commons.voice.AIAssist;
@@ -27,7 +22,6 @@ import com.mogo.map.navi.MogoNaviListenerHandler;
import com.mogo.map.navi.MogoTraffic;
import com.mogo.map.navi.OnCalculatePathItemClickInteraction;
import com.mogo.utils.UiThreadHandler;
-import com.mogo.utils.WorkThreadHandler;
import com.mogo.utils.logger.Logger;
import java.util.List;
@@ -43,7 +37,6 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter {
private static final String TAG = "NaviListenerAdapter";
private Context mContext;
- private AMapNavi mAMapNavi;
private NaviClient mClient;
/**
* 导航状态:true - 导航 onStartNavi(int) 被调用, false - 到达目的地、手动挺固执
@@ -60,11 +53,10 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter {
*/
private NaviOverlayHelper mNaviOverlayHelper;
- public NaviListenerAdapter( Context mContext, AMapNavi mAMapNavi, NaviClient client ) {
+ public NaviListenerAdapter( Context mContext, NaviClient client ) {
this.mContext = mContext;
- this.mAMapNavi = mAMapNavi;
this.mClient = client;
- mNaviOverlayHelper = new NaviOverlayHelper( mAMapNavi, AMapWrapper.getAMap(), mContext );
+ mNaviOverlayHelper = new NaviOverlayHelper( AMapWrapper.getAMap(), mContext );
}
public void setNaviing( boolean mIsNaviing ) {
@@ -240,16 +232,15 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter {
mNaviOverlayHelper.clearCalculatedOverlay();
setStopped( true );
setNaviing( false );
- mAMapNavi.stopNavi();
+ mClient.stopAMapNavi();
MogoNaviListenerHandler.getInstance().onStopNavi();
AMapMessageManager.getInstance().postNaviStopped();
}
public void handleClickedPolyline( Polyline polyline ) {
if ( mNaviOverlayHelper != null ) {
-
mNaviOverlayHelper.handleClickedPolyline( polyline, isNaviing() );
- mAMapNavi.selectRouteId( mNaviOverlayHelper.getSelectedPathId() );
+ mClient.selectAMapRouteId( mNaviOverlayHelper.getSelectedPathId() );
mNaviOverlayHelper.showBoundsWithSettingBounds();
}
}
diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java
index c057446979..4da21b2f24 100644
--- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java
+++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java
@@ -14,7 +14,6 @@ import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.Polyline;
-import com.amap.api.navi.AMapNavi;
import com.amap.api.navi.model.AMapNaviLocation;
import com.amap.api.navi.model.AMapNaviPath;
import com.amap.api.navi.model.NaviInfo;
@@ -55,7 +54,6 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction {
*/
public static final float AMAP_ROUTE_OVERLAY_TRANSPARENCY_UNSELECTED = 0.3f;
- private AMapNavi mAMapNavi;
private AMap mAMap;
private Context mContext;
// 规划的路线显示边距
@@ -73,8 +71,7 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction {
*/
private List< Marker > mMarkers = new ArrayList<>();
- public NaviOverlayHelper( AMapNavi mAMapNavi, AMap mAMap, Context mContext ) {
- this.mAMapNavi = mAMapNavi;
+ public NaviOverlayHelper( AMap mAMap, Context mContext ) {
this.mAMap = mAMap;
this.mContext = mContext;
calculateBoundArea();
@@ -125,7 +122,7 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction {
*/
private List< CalculatePathItem > getSortedPaths() {
checkAMapInstance();
- final Map< Integer, AMapNaviPath > pathMap = mAMapNavi.getNaviPaths();
+ final Map< Integer, AMapNaviPath > pathMap = NaviClient.getInstance( mContext ).getAMapNaviPaths();
if ( pathMap == null || pathMap.isEmpty() ) {
return null;
}
@@ -219,7 +216,7 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction {
mSelectedCalculatePathItem = item;
//wrapper.setStartBitmap( R.drawable.ic_navi_start )
// .setEndBitmap( R.drawable.ic_navi_target );
- mAMapNavi.selectRouteId( item.getId() );
+ NaviClient.getInstance( mContext ).selectAMapRouteId( item.getId() );
Logger.d( TAG, "renderPathOverlay set default path" );
}
wrapper.addToMap();
@@ -435,7 +432,7 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction {
@Override
public void onItemClicked( String tagId ) {
handleClickedPolyline( tagId );
- mAMapNavi.selectRouteId( getSelectedPathId() );
+ NaviClient.getInstance( mContext ).selectAMapRouteId( getSelectedPathId() );
showBounds( mBoundRect );
}
diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/service/MogoMainService.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/service/MogoMainService.java
index 788d0c81db..077ec59994 100644
--- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/service/MogoMainService.java
+++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/service/MogoMainService.java
@@ -42,11 +42,11 @@ class MogoMainService extends Service implements IMogoLocationListener {
Logger.d(TAG, "基本服务启动");
mServiceApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation();
initAndStartLocation();
- initGpsSimulatorListener();
UiThreadHandler.postDelayed(() -> {
loadBaseModules();
startTanluService();
initADAS();
+ initGpsSimulatorListener();
}, 2_000L
);
}
diff --git a/modules/mogo-module-widgets/src/main/java/com/mogo/module/widgets/AutoNaviIntentHandler.java b/modules/mogo-module-widgets/src/main/java/com/mogo/module/widgets/AutoNaviIntentHandler.java
index f9b9070d03..9602906ce0 100644
--- a/modules/mogo-module-widgets/src/main/java/com/mogo/module/widgets/AutoNaviIntentHandler.java
+++ b/modules/mogo-module-widgets/src/main/java/com/mogo/module/widgets/AutoNaviIntentHandler.java
@@ -102,6 +102,9 @@ class AutoNaviIntentHandler implements IMogoVoiceCmdCallBack {
} );
}
try {
+ if ( mWindowManagerView.isShowing() ) {
+ return;
+ }
mWindowManagerView.show();
MogoWidgetManger.getInstance().getApis().getAnalyticsApi().track( "NAVI_button_show", null );
AIAssist.getInstance( context ).registerUnWakeupCommand( OPEN, new String[]{"切换到辅助驾驶模式"}, this );
@@ -159,6 +162,7 @@ class AutoNaviIntentHandler implements IMogoVoiceCmdCallBack {
@Override
public void onCmdSelected( String cmd ) {
if ( TextUtils.equals( OPEN, cmd ) ) {
+ Logger.d(TAG, "recognized open command.");
enterApp( AbsMogoApplication.getApp() );
}
}