开发 出行解决方案接入规范 行程中-相关服务 司乘同显 司乘同显-司机端-Android

司乘同显-司机端-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 

当前模式无法切换到导航模式 

使用司乘导航一体化时才有可能出现此错误吗,当前没有路线,不是接驾、送驾状态时无法切换到导航模式 

如果需要切换到导航模式,需要设置正确的参数之后,再切换 


返回顶部 示例中心 常见问题 智能客服 公众号
二维码