司乘同显-司机端-Android 最后更新时间: 2021年01月22日
概述
司乘同显Android司机端服务接入和重要功能介绍, 相关具体接入文档请查看参考手册.
1.获取Key
1.创建新应用
进入控制台,创建一个新应用。如果您之前已经创建过应用,可直接跳过这个步骤。
2.添加新key
在创建的应用上点击"添加新Key"按钮,在弹出的对话框中,依次输入应用名名称,选择绑定的服务为“Android平台SDK”,输入发布版安全码 SHA1、调试版安全码 SHA1、以及 Package,如下图所示:
需要注意的是: 1个KEY只能用于一个应用(多渠道安装包属于多个应用),1个Key在多个应用上使用会出现服务调用失败。
在阅读完高德地图API服务条款后,勾选此选项,点击“提交”,完成 Key 的申请,此时您可以在所创建的应用下面看到刚申请的 Key 了。
3.开通权限
需要联系高德对应接口人开通司乘同显相关权限。
4.配置key
在AndroidManifest.xml 的 application 标签下加入如下内容:
<meta-data android:name="com.amap.api.v2.apikey" android:value="key">
//开发者申请的key
</meta-data
2.集成SDK包
1.添加库文件
拷贝jar+so到工程libs文件夹下:
2.gradle配置
配置so路径,打开build.gradle,找到 sourceSets 标签,在里面添加如下配置:
main {
jniLibs.srcDirs = ['libs']
}
快速接入
1、创建DriverRouteManager
1) 初始化资源,更多设置可以参考RouteOverlayOptions的接口说明:
// 实例司乘同显 参数类
RouteOverlayOptions options = new RouteOverlayOptions();
// 设置 小车图标
options.carIcon(BitmapDescriptorFactory.fromResource(R.drawable.icon_car));
// 设置 起点图标
options.startPointIcon(BitmapDescriptorFactory.fromResource(R.drawable.amap_start));
// 设置终点图标
options.endPointIcon(BitmapDescriptorFactory.fromResource(R.drawable.amap_end));
2)创建DriverRouteManager
DriverRouteManager driverRouteManager = new DriverRouteManager(context, aMap, options);
2、设置订单信息
1)创建OrderProperty
//设置订单类型(普通、拼车)及订单ID
OrderProperty orderProperty = new OrderProperty(SCTXConfig.SCTX_ORDER_TYPE_NORMAL, OrderId);
//设置车辆信息,场景:司机位置VDC同步(可选)
CarInfo carInfo = new CarInfo();
carInfo.setVehicleID("Test100");
carInfo.setCity("010");
carInfo.setVehicleType(CarInfo.VEHICHLE_TYPE_ELECTRIC);
orderProperty.setCarInfo(carInfo);
//设置轨迹服务sid,场景:显示历史轨迹(可选)
orderProperty.setServiceId("1786");
2)设置OrderProperty
//设置orderProperty、上车点坐标、目的地坐标
driverRouteManager.setOrderProperty(orderProperty, new LatLng(39.992932, 116.479262), new LatLng(39.993343, 116.474574));
3、切换订单状态
1)订单状态类型,参考(com.amap.sctx.SCTXConfig)
SCTX_ORDER_STATUS_UNSPECIFIED = 0;//未知状态
SCTX_ORDER_STATUS_PICKUPPASSENGER = 1;//去接乘客
SCTX_ORDER_STATUS_WAITPASSENGER = 2;//等待乘客上车
SCTX_ORDER_STATUS_PASSENGERONBOARD = 3;//乘客以上车
SCTX_ORDER_STATUS_ORDERCOMPLETE = 4;//订单结束
SCTX_ORDER_STATUS_OFFLINE = 5;//离线状态,只走降级策略获取司机位置,内部不做其他请求
2)订单状态切换
driverRouteManager.setOrderState(SCTXConfig.SCTX_ORDER_STATUS_PICKUPPASSENGER);
运行效果:
4、调起导航组件
在接乘客和送乘客阶段可以调起高德导航组件进行导航:
1)需要在AndroidManifest.xml里注册AmapRouteActivity
<activity
android:theme="@android:style/Theme.NoTitleBar"
android:name="com.amap.api.navi.AmapRouteActivity"></activity>
2)调用DriverRouteManager的startNavi方法开启导航:
DriverRouteManager.NaviParams naviParams = new DriverRouteManager.NaviParams();
naviParams.setNeedCalculateRoute(false);//界面启动是否需要重新算路
naviParams.setTrafficEnable(true);//导航界面是否开启路况
/**
* 调起导航组件,开启导航
* @param context 上下文
* @param callback 导航信息回调
* @param params 导航组件初始化参数
*/
driverRouteManager.startNavi(this, new INaviInfoCallback() {
/**
* 导航初始化失败时的回调函数。
*/
@Override
public void onInitNaviFailure() {}
/**
* 导航播报信息回调函数。
* @param s 播报文字
*/
@Override
public void onGetNavigationText(String s) {}
/**
* 当GPS位置有更新时的回调函数。
* @param aMapNaviLocation 当前位置的定位信息。
*/
@Override
public void onLocationChange(AMapNaviLocation aMapNaviLocation) {}
/**
* 到达目的地后回调函数。
* @param b true代表是模拟导航到达目的地,false代表实时导航到达目的地
*/
@Override
public void onArriveDestination(boolean b) {}
/**
* 启动导航后的回调函数
* @param i 导航类型参见NaviType
*/
@Override
public void onStartNavi(int i) {}
/**
* 算路成功回调
* @param ints 路线id数组
*/
@Override
public void onCalculateRouteSuccess(int[] ints) {}
/**
* 驾车路径规划失败后的回调函数。
* @param errorInfo 参见PathPlanningErrCode
*/
@Override
public void onCalculateRouteFailure(int errorInfo) {}
/**
* 停止播报回调
*/
@Override
public void onStopSpeaking() {}
/**
* 重新规划的回调
* @param type 参见ReCalculateRouteType
*/
@Override
public void onReCalculateRoute(int type) {}
/**
* 退出组件或退出组件导航的回调函数
* @param pageType 参见PageType
*/
@Override
public void onExitPage(int pageType) {}
/**
* 切换算路偏好回调
* @param strategy 切换后偏好 参见PathPlanningStrategy
*/
@Override
public void onStrategyChanged(int strategy) {}
/**
* 获取导航地图自定义View,该View在导航整体界面的下面,注意要设置setLayoutParams并且设置高度
*/
@Override
public View getCustomNaviBottomView() {
return null;
}
/**
* 获取导航地图自定义View,该View在导航界面的当前路名位置,使用该方法以后,将不会显示当前路名
*/
@Override
public View getCustomNaviView() {
return null;
}
/**
* 驾车路径导航到达某个途经点的回调函数。
* @param wayID 到达途径点的编号,标号从0开始,依次累加。
*/
@Override
public void onArrivedWayPoint(int wayID) {}
/**
* 组件地图白天黑夜模式切换回调
* @param mapType 枚举值参考AMap类,3 黑夜,4 白天
*/
@Override
public void onMapTypeChanged(int mapType) {}
}, naviParams);
5、销毁
driverRouteManager.destroy();//释放资源
功能使用
功能1:设置订单号
//设置订单类型(普通、拼车)及订单ID
OrderProperty orderProperty = new OrderProperty(SCTXConfig.SCTX_ORDER_TYPE_NORMAL, OrderId);
//设置orderProperty、上车点坐标、目的地坐标
driverRouteManager.setOrderProperty(orderProperty, new LatLng(39.992932, 116.479262), new LatLng(39.993343, 116.474574));
功能2:使用网约车路线规划模式
/**
* 设置网约车算路模式是否开启,在开启的情况下,会对路线做特殊处理,更符合网约车场景
* @param isOnlineCarHailingEnable 是否开启,默认:开
* @since 3.1.0
*/
public void setOnlineCarHailingPlanRouteEnable(boolean isOnlineCarHailingEnable)
功能3: 通过POIID算路, 解决场站到达点问题
送驾设置订单信息(Poi算路+途经点)
场景1:订单终点来自POI搜索, 则使用POIID ; 例: 搜索- 首都机场T3航站楼 ; 输入POIID, 导航终点到首都机场T3(出发层) 到达点
场景2:订单终点来自于经纬度, 则使用经纬度直接请求
//上车点信息,经纬度必须填,否则起点图标不显示
LatLng pickUpLatLng = new LatLng(39.722147,116.345131);
Poi pickUpPosition = new Poi("大兴桥",pickUpLatLng,"B0FFFAAA98");
//目的地信息,经纬度必须填,否则终点图标不显示
LatLng endLatLng = new LatLng(39.944304,116.482534);
/**Poi支持传入经纬度和PoiID,PoiiD优先级更高,使用Poiid算路,导航终点会更合理**/
Poi endPosition = new Poi("朝阳公园",endLatLng,"B000A7CA07");
//初始化订单信息
OrderProperty orderProperty = new OrderProperty(SCTXConfig.SCTX_ORDER_TYPE_NORMAL, mOrderId);
mDriverRouteManager.setOrderProperty(orderProperty,pickUpPosition, endPosition,null);
功能4: 司机端实时展示备选路线
/**
* 设置导航界面中是否开启多路线导航模式(导航中拥有若干条备选路线供用户选择), 默认开启.
* 注意:此方法需要在算路前调用,下次主动算路的时候生效,以下情况不会出现多备选路线:
* 路线存在途经点、路线长度超过80KM。
* @since 2.4.0
* @param multipleRouteNaviMode true:多路线导航模式, false:单路线导航模式,默认true
*/
public void setMultipleRouteNaviMode(boolean multipleRouteNaviMode)
功能5: 展示历史轨迹
/**
* 是否绘制走过的路,注:若显示完整历史轨迹,需要司机端同步司机位置到VDC
*
* @param isDrawPassedTrace
* @since 2.0.0
*/
public void setDrawPassedTrace(boolean isDrawPassedTrace)
功能6: 多订单场景支持
设置订单类型
/**
* 普通订单
* @since 2.0.0
*/
public final static int SCTX_ORDER_TYPE_NORMAL = 0;
/**
* 拼车订单
* @since 2.0.0
*/
public final static int SCTX_ORDER_TYPE_CARSHARING = 1;
功能7: 设置途经点
设置途径点列表
/**
* 设置途经点列表(拼车)
*
* @param wayPointInfos 途经点列表
* @since 2.0.0
*/
public void setWayPoints(List<WayPointInfo> wayPointIn)
选择路线
/**
* 选择行驶路线
*
* @param routeId 导航返回的routeId
* @since 2.3.1
*/
public void selectRoute(int routeId)
获取为到达途经点列表
/**
* 获取未到达途经点列表
* @return
* @since 2.3.1
*/
public List<LatLng> getRemainingWayPoint()
移除途经点
/**
* 移除某一个途经点
* @param latLng
* @since 2.3.1
*/
public void removeWayPoint(LatLng latLng)
功能8: 司机端调用导航组件
1)需要在AndroidManifest.xml里注册AmapRouteActivity
<activity
android:theme="@android:style/Theme.NoTitleBar"
android:name="com.amap.api.navi.AmapRouteActivity"></activity>
2)调用DriverRouteManager的startNavi方法开启导航:
DriverRouteManager.NaviParams naviParams = new DriverRouteManager.NaviParams();
//调起导航是否重新算路,正常不需要重新算路,会直接使用当前司乘同显界面展示的路线
naviParams.setNeedCalculateRoute(false);
//是否开启路况
naviParams.setTrafficEnable(true);
//是否使用内置语音
naviParams.setUseInnerVoice(true);
//是否开启多备选路线
naviParams.setMultipleRouteNaviMode(true);
/**
* 调起导航组件,开启导航
* @param context 上下文
* @param callback 导航信息回调
* @param params 导航组件初始化参数
*/
myDriverRouteManager.getDriverRouteManager().startNavi(this, new INaviInfoCallback() {
/**
* 导航初始化失败时的回调函数。
*/
@Override
public void onInitNaviFailure() {}
/**
* 导航播报信息回调函数。
* @param s 播报文字
*/
@Override
public void onGetNavigationText(String s) {}
/**
* 当GPS位置有更新时的回调函数。
* @param aMapNaviLocation 当前位置的定位信息。
*/
@Override
public void onLocationChange(AMapNaviLocation aMapNaviLocation) {}
/**
* 到达目的地后回调函数。
* @param b true代表是模拟导航到达目的地,false代表实时导航到达目的地
*/
@Override
public void onArriveDestination(boolean b) {}
/**
* 启动导航后的回调函数
* @param i 导航类型参见NaviType
*/
@Override
public void onStartNavi(int i) {}
/**
* 算路成功回调
* @param ints 路线id数组
*/
@Override
public void onCalculateRouteSuccess(int[] ints) {}
/**
* 驾车路径规划失败后的回调函数。
* @param errorInfo 参见PathPlanningErrCode
*/
@Override
public void onCalculateRouteFailure(int errorInfo) {}
/**
* 停止播报回调
*/
@Override
public void onStopSpeaking() {}
/**
* 重新规划的回调
* @param type 参见ReCalculateRouteType
*/
@Override
public void onReCalculateRoute(int type) {}
/**
* 退出组件或退出组件导航的回调函数
* @param pageType 参见PageType
*/
@Override
public void onExitPage(int pageType) {}
/**
* 切换算路偏好回调
* @param strategy 切换后偏好 参见PathPlanningStrategy
*/
@Override
public void onStrategyChanged(int strategy) {}
/**
* 获取导航地图自定义View,该View在导航整体界面的下面,注意要设置setLayoutParams并且设置高度
*/
@Override
public View getCustomNaviBottomView() {
return null;
}
/**
* 获取导航地图自定义View,该View在导航界面的当前路名位置,使用该方法以后,将不会显示当前路名
*/
@Override
public View getCustomNaviView() {
return null;
}
/**
* 驾车路径导航到达某个途经点的回调函数。
* @param wayID 到达途径点的编号,标号从0开始,依次累加。
*/
@Override
public void onArrivedWayPoint(int wayID) {}
/**
* 组件地图白天黑夜模式切换回调
* @param mapType 枚举值参考AMap类,3 黑夜,4 白天
*/
@Override
public void onMapTypeChanged(int mapType) {}
}, naviParams);
Android导航组件支持自定义区域
导航组件现阶段不支持全部自定义,只支持部分区域内进行自定义,可以通过实现INaviInfoCallback的接口,实现以下三个方法实现区域内自定义
1.设置左边的自定义区域
/**
*获取导航地图自定义View,该View在导航界面的垂直居中,水平靠左位置
*/
@Override
public View getCustomMiddleView() {
//返回null则不显示自定义区域
return null;
}
2.设置底部自定义区域
/**
* 获取导航地图自定义View,该View在导航整体界面的下面,注意要设置setLayoutParams并且设置高度
*/
@Override
public View getCustomNaviBottomView() {
//返回null则不显示自定义区域
return null;
}
3.设置中部自定义区域
/**
* 获取导航地图自定义View,该View在导航界面的当前路名位置,使用该方法以后,将不会显示当前路名
*/
@Override
public View getCustomNaviView() {
//返回null则不显示自定义区域
return null;
}
4. 效果示意图:
功能9: 司机端展示乘客位置
第一步,打开乘客端位置上传
1) 初始化资源,更多设置可以参考RouteOverlayOptions的接口说明:
// 实例司乘同显 参数类
RouteOverlayOptions options = new RouteOverlayOptions();
// 设置 小车图标
options.carIcon(BitmapDescriptorFactory.fromResource(R.drawable.icon_car));
// 设置 起点图标
options.startPointIcon(BitmapDescriptorFactory.fromResource(R.drawable.amap_start));
// 设置终点图标
options.endPointIcon(BitmapDescriptorFactory.fromResource(R.drawable.amap_end));
//打开乘客位置上传,默认关闭
options.setUserLocationUploadEnable(true);
2)创建PassengerRouteManager
PassengerRouteManager passengerRouteManager = new PassengerRouteManager(context, aMap, options);
第二步,司机端开启乘客位置显示
1) 初始化资源,更多设置可以参考RouteOverlayOptions的接口说明:
// 实例司乘同显 参数类
RouteOverlayOptions options = new RouteOverlayOptions();
// 设置 小车图标
options.carIcon(BitmapDescriptorFactory.fromResource(R.drawable.icon_car));
// 设置 起点图标
options.startPointIcon(BitmapDescriptorFactory.fromResource(R.drawable.amap_start));
// 设置终点图标
options.endPointIcon(BitmapDescriptorFactory.fromResource(R.drawable.amap_end));
//设置乘客位置自定义图标
options.userLocationIcon(BitmapDescriptorFactory.fromResource(R.drawable.user));
//开启乘客位置显示,默认关闭
options.setUserLocationVisible(true);
2)创建DriverRouteManager
DriverRouteManager driverRouteManager = new DriverRouteManager(context, aMap, options);
效果展示:
功能10: 设置新能源/出租车/普通车辆全场景规避限行
//设置车辆车牌号码。如:京ABZ239
public void setPlateNumber(java.lang.String plateNumber)
/**
* 设置车辆动力类型
* @param powerType - 车辆动力类型,参考常量可以参考:
* 1、VEHICLE_POWER_TYPE_ELECTRIC = 1 车辆动力类型--纯电动
* 2、VEHICLE_POWER_TYPE_MIX = 2 车辆动力类型--混动
* 3、VEHICLE_POWER_TYPE_OIL = 0 车辆动力类型--燃油
*/
public void setPowerType(int powerType)
/**
* 设置车辆类型
* @param vehicleType -车辆类型 ,参考常量可以参考SCTXConfig:
* 1、VEHICLE_TYPE_TAXI = 1 出租车
* 2、VEHICLE_TYPE_ELECTRIC = 2 新能源
* 3、VEHICLE_TYPE_COMFORT = 3 舒适性
* 4、VEHICLE_TYPE_LUXURY = 4 豪华型
* 5、VEHICLE_TYPE_BUSINESS =5 商务型
* 6、VEHICLE_TYPE_OTHER = 6其他
*/
public void setVehicleType(int vehicleType)
司机端错误码说明
错误码 | 含义 | 备注 | 建议 |
---|---|---|---|
1000 | 网络问题请求失败 | 连续10次上传失败会报此错误码。 | 收集即可,无需做处理 |
1001 | 司机端算路失败 | 司机端算路失败,一般是在订单切换时和调用司乘的重新算路接口才会出现 | 收到这个错误码之后,需要调用DriverRouteManager.reCaclRoute接口 |
1004 | 途经点更新 | 司机端收到乘客端修改途经点的消息 | 收集即可 |
1005 | 终点更新 | 司机端收到乘客端修改终点的消息 | 收集即可,无需做处理 |
3005 | 切换乘客行前选择的路线成功 | 如果乘客有行前选路,在司机端切换到送驾状态时会先进行行前路线的切换 | 收集即可,无需做处理 |
3006 | 切换乘客行前选择的路线失败 | 如果切换失败,内部会主动重新算路。 | 收集即可,无需做处理 |
3007 | 行中,切换乘客选择路线成功 | 送驾过程中,如果乘客进行了行中选路,司机端收到消息之后,切换成功。 | 可以用来提示司机乘客切换路线 |
3008 | 行中,切换乘客选择路线失败 | 一般是发生在在乘客选路之后司机端正好发生偏航的情况。概率较小 | 乘客端会收到对应的错误码,司机端可以只做记录 |
3009 | 司机偏航 | 司机发生偏航 | 收集即可,无需做处理 可根据业务需要作相应的提示 可用于后续问题分析、判责等 |
3010 | 当前路线有途经点,切换路线失败 | 有途经点的情况下,不允许司机切换路线,极少出现 | 收集即可,无需做处理 |
3012 | 行程目的地变更,司机端切换路线失败 | 在还原乘客端行前选择路线时,发现行程终点有变更 | 收集即可,无需做处理 |
5001 | 当前模式无法切换到导航模式 | 使用司乘导航一体化时才有可能出现此错误吗,当前没有路线,不是接驾、送驾状态时无法切换到导航模式 | 如果需要切换到导航模式,需要设置正确的参数之后,再切换 |