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() ); } }