1. 修改导航组件功能:实现按需加载
2. 1.1.3 需求研发:导航悬浮按钮、桌面卡片播报策略。
This commit is contained in:
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -4,7 +4,7 @@
|
||||
<asm skipDebug="false" skipFrames="false" skipCode="false" expandFrames="false" />
|
||||
<groovy codeStyle="LEGACY" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="JDK" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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() );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user