diff --git a/.idea/dictionaries/zhongchao.xml b/.idea/dictionaries/zhongchao.xml index 2685c01..8318e67 100644 --- a/.idea/dictionaries/zhongchao.xml +++ b/.idea/dictionaries/zhongchao.xml @@ -3,6 +3,7 @@ amap coor + designative mogo diff --git a/app/src/main/java/com/mogo/cloud/LivePlayActivity.java b/app/src/main/java/com/mogo/cloud/LivePlayActivity.java index e744ef6..d85c818 100644 --- a/app/src/main/java/com/mogo/cloud/LivePlayActivity.java +++ b/app/src/main/java/com/mogo/cloud/LivePlayActivity.java @@ -10,14 +10,13 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.ToggleButton; - -import com.mogo.cloud.trafficlive.api.ITrafficLiveCallBack; +import com.mogo.cloud.trafficlive.api.ITrafficCarLiveCallBack; import com.mogo.cloud.trafficlive.api.MoGoAiCloudTrafficLive; import com.mogo.cloud.wifi.IWifiStateListener; import com.mogo.cloud.wifi.WifiStateManager; -public class LivePlayActivity extends AppCompatActivity implements ITrafficLiveCallBack, IWifiStateListener { +public class LivePlayActivity extends AppCompatActivity implements ITrafficCarLiveCallBack, IWifiStateListener { private String TAG = "LiveActivity"; private SurfaceView surfaceView; @@ -38,9 +37,10 @@ public class LivePlayActivity extends AppCompatActivity implements ITrafficLiveC Toast.makeText(getApplicationContext(), buttonView.getText(), Toast.LENGTH_SHORT).show(); if (isChecked) { liveSn = etLookRoomId.getText().toString().trim(); - MoGoAiCloudTrafficLive.viewVehicleHeadLive(this.getApplication(), liveSn, surfaceView, this); + MoGoAiCloudTrafficLive.viewDesignativeVehicleLive(liveSn, surfaceView, this); +// MoGoAiCloudTrafficLive.viewFrontVehicleLive(39.968253, 116.410829, 0, surfaceView, this); } else { - MoGoAiCloudTrafficLive.stopLive(liveSn); + MoGoAiCloudTrafficLive.stopCarLive(liveSn); } }); WifiStateManager.getInstance().registerWifiStateListener(this); @@ -49,7 +49,7 @@ public class LivePlayActivity extends AppCompatActivity implements ITrafficLiveC @Override protected void onDestroy() { super.onDestroy(); - MoGoAiCloudTrafficLive.stopLive(liveSn); + MoGoAiCloudTrafficLive.stopCarLive(liveSn); WifiStateManager.getInstance().unRegisterWifiStateListener(this); } diff --git a/app/src/main/java/com/mogo/cloud/LivePlayAndPushActivity.java b/app/src/main/java/com/mogo/cloud/LivePlayAndPushActivity.java index 314a4ef..d24c00e 100644 --- a/app/src/main/java/com/mogo/cloud/LivePlayAndPushActivity.java +++ b/app/src/main/java/com/mogo/cloud/LivePlayAndPushActivity.java @@ -7,18 +7,17 @@ import android.util.Log; import com.mogo.cloud.live.listener.ILiveStatusListener; import com.mogo.cloud.live.manager.LiveStreamManagerImpl; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.cloud.trafficlive.api.ITrafficLiveCallBack; +import com.mogo.cloud.trafficlive.api.ITrafficCarLiveCallBack; import com.mogo.cloud.trafficlive.api.MoGoAiCloudTrafficLive; import com.mogo.cloud.utils.logger.Logger; import com.mogo.cloud.wifi.IWifiStateListener; -import com.mogo.cloud.wifi.WifiStateManager; /** * 推流和拉流页面 */ public class LivePlayAndPushActivity extends BaseLiveActivity - implements ITrafficLiveCallBack, IWifiStateListener { + implements ITrafficCarLiveCallBack, IWifiStateListener { public static final String TAG = "LivePlayAndPushActivity"; private String liveSn; @@ -90,10 +89,9 @@ public class LivePlayAndPushActivity extends BaseLiveActivity public void togglePlay(boolean isPlay) { if (isPlay) { liveSn = etLookRoomId.getText().toString().trim(); - MoGoAiCloudTrafficLive.viewVehicleHeadLive(this.getApplication(), - liveSn, surfacePlayView, this); + MoGoAiCloudTrafficLive.viewDesignativeVehicleLive(liveSn, surfacePlayView, this); } else { - MoGoAiCloudTrafficLive.stopLive(liveSn); + MoGoAiCloudTrafficLive.stopCarLive(liveSn); } } @@ -117,7 +115,7 @@ public class LivePlayAndPushActivity extends BaseLiveActivity liveStreamManager.release(); } - MoGoAiCloudTrafficLive.stopLive(liveSn); + MoGoAiCloudTrafficLive.stopCarLive(liveSn); // WifiStateManager.getInstance().unRegisterWifiStateListener(this); } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c3e69bd..a867d29 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -90,7 +90,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:text="直播SDK观看测试" - android:visibility="gone" /> + android:visibility="visible" /> \ No newline at end of file diff --git a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/listener/IRequestLiveListener.java b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/listener/IRequestLiveListener.java index 958699c..63be4a3 100644 --- a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/listener/IRequestLiveListener.java +++ b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/listener/IRequestLiveListener.java @@ -2,7 +2,14 @@ package com.mogo.cloud.live.listener; public interface IRequestLiveListener { - void onSuccess(); + default void onSuccess() { + } + + default void onSuccess(String liveUrl) { + } + + default void onSuccess(String liveSn, String liveUrl, double lat, double lon) { + } void onError(Throwable e); } diff --git a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/manager/RequestLiveManager.java b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/manager/RequestLiveManager.java index df34be9..75a126c 100644 --- a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/manager/RequestLiveManager.java +++ b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/manager/RequestLiveManager.java @@ -5,6 +5,7 @@ import com.mogo.cloud.live.constant.LiveConstant; import com.mogo.cloud.live.listener.IRequestLiveListener; import com.mogo.cloud.live.model.BaseData; import com.mogo.cloud.live.model.LivePush; +import com.mogo.cloud.live.model.LiveReceive; import com.mogo.cloud.live.network.LiveApiServer; import com.mogo.cloud.network.NetConstants; import com.mogo.cloud.network.RetrofitFactory; @@ -32,7 +33,7 @@ public class RequestLiveManager { private final LiveApiServer liveApiServer; private RequestLiveManager() { - liveApiServer = RetrofitFactory.INSTANCE.getInstance(NetConstants.DEVA_HOST) + liveApiServer = RetrofitFactory.INSTANCE.getInstance(NetConstants.DEVA_HOST) //todo 涉及直播接口 没有对HttpDNS进行配置 .create(LiveApiServer.class); } @@ -50,18 +51,18 @@ public class RequestLiveManager { /** * 请求服务器查看指定车机开启或关闭直播 * - * @param type - * @param liveSn - * @param requestLiveListener + * @param type 0:open 1:close + * @param liveSn 直播SN + * @param requestLiveListener {@link IRequestLiveListener} */ - public void requestVehicleHeadLive(String type, String liveSn, IRequestLiveListener requestLiveListener) { + public void requestDesignativeVehicleLive(String type, String liveSn, IRequestLiveListener requestLiveListener) { Gson gson = new Gson(); LivePush livePush = new LivePush(liveSn, type, FRONT_CAMERA); String sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); Map map = new HashMap<>(); map.put("sn", sn); map.put("data", gson.toJson(livePush)); - liveApiServer.getVehicleHeadLive(map) + liveApiServer.getDesignativeVehicleLive(map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -82,7 +83,153 @@ public class RequestLiveManager { if (requestLiveListener != null) { requestLiveListener.onError(e); } - Logger.e(LiveConstant.TAG, "requestVehicleHeadLive exception : " + e); + Logger.e(LiveConstant.TAG, "requestDesignativeVehicleLive exception : " + e); + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 请求服务器查看前方车机开启直播 + * + * @param lat 纬度 + * @param lon 经度 + * @param bearing 方向角 + * @param requestLiveListener {@link IRequestLiveListener} + */ + public void requestFrontVehicleLive(double lat, double lon, int bearing, IRequestLiveListener requestLiveListener) { + Gson gson = new Gson(); + String sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); + LivePush livePush = new LivePush(sn, FRONT_CAMERA, lat, lon, bearing); + Map map = new HashMap<>(); + map.put("sn", sn); + map.put("data", gson.toJson(livePush)); + liveApiServer.getFrontVehicleLive(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull BaseData baseData) { + if (requestLiveListener != null) { + LiveReceive liveReceive = baseData.result; + if (liveReceive != null && liveReceive.getLive() != null && liveReceive.getSn() != null) { + requestLiveListener.onSuccess(liveReceive.getSn(), liveReceive.getLive(), + liveReceive.getLat(), liveReceive.getLon()); + } else { + Logger.e(LiveConstant.TAG, "requestFrontVehicleLive exception : live receive msg is wrong, please check param"); + } + } + } + + @Override + public void onError(@NonNull Throwable e) { + if (requestLiveListener != null) { + requestLiveListener.onError(e); + } + Logger.e(LiveConstant.TAG, "requestFrontVehicleLive exception : " + e); + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 请求服务器查看前方路口直播 + * + * @param lat 纬度 + * @param lon 经度 + * @param bearing 方向角 + * @param requestLiveListener {@link IRequestLiveListener} + */ + public void requestFrontIntersectionLive(double lat, double lon, int bearing, IRequestLiveListener requestLiveListener) { + Gson gson = new Gson(); + String sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); + LivePush livePush = new LivePush(sn, lat, lon, bearing); + Map map = new HashMap<>(); + map.put("sn", sn); + map.put("data", gson.toJson(livePush)); + liveApiServer.getFrontIntersectionLive(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull BaseData baseData) { + if (requestLiveListener != null) { + LiveReceive liveReceive = baseData.result; + if (liveReceive != null && liveReceive.getLive() != null) { + requestLiveListener.onSuccess(liveReceive.getLive()); + } else { + Logger.e(LiveConstant.TAG, "requestFrontIntersectionLive exception : live receive msg is wrong, please connect tech"); + } + } + } + + @Override + public void onError(@NonNull Throwable e) { + if (requestLiveListener != null) { + requestLiveListener.onError(e); + } + Logger.e(LiveConstant.TAG, "requestFrontIntersectionLive exception : " + e); + } + + @Override + public void onComplete() { + + } + }); + } + + public void requestDesignativeIntersectionLive(int cameraId, double lat, double lon, IRequestLiveListener requestLiveListener) { + Gson gson = new Gson(); + String sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); + LivePush livePush = new LivePush(cameraId, lat, lon); + Map map = new HashMap<>(); + map.put("sn", sn); + map.put("data", gson.toJson(livePush)); + liveApiServer.getDesignativeIntersectionLive(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull BaseData baseData) { + if (requestLiveListener != null) { + LiveReceive liveReceive = baseData.result; + if (liveReceive != null && liveReceive.getLive() != null) { + requestLiveListener.onSuccess(liveReceive.getLive()); + } else { + Logger.e(LiveConstant.TAG, "requestDesignativeIntersectionLive exception : live receive msg is wrong, please connect tech"); + } + } + } + + @Override + public void onError(@NonNull Throwable e) { + if (requestLiveListener != null) { + requestLiveListener.onError(e); + } + Logger.e(LiveConstant.TAG, "requestDesignativeIntersectionLive exception : " + e); } @Override diff --git a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/BaseData.java b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/BaseData.java index 035b97b..0e89d6e 100644 --- a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/BaseData.java +++ b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/BaseData.java @@ -4,10 +4,11 @@ import com.elegant.network.NetConstants; import java.io.Serializable; -public class BaseData implements Serializable, Cloneable { +public class BaseData implements Serializable, Cloneable { public int code = NetConstants.NO_DATA; public String msg; + public T result; public BaseData clone() { BaseData obj = null; @@ -18,4 +19,8 @@ public class BaseData implements Serializable, Cloneable { } return obj; } + + public T getT() { + return result; + } } diff --git a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/LivePush.java b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/LivePush.java index 9a90c85..0765cd7 100644 --- a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/LivePush.java +++ b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/LivePush.java @@ -5,9 +5,19 @@ package com.mogo.cloud.live.model; */ public class LivePush { - private String sn; - private String type; + private int id; //路口摄像头id + private String sn; //直播车机sn + private String type; //直播类型 0:开启直播 1:关闭直播 private String videoChannel; //C_1 前摄 + private double lat; //本机纬度 + private double lon; //本机经度 + private int bearing; //本机方向角 + + public LivePush(int id, double lat, double lon) { + this.id = id; + this.lat = lat; + this.lon = lon; + } public LivePush(String sn, String type, String videoChannel) { this.sn = sn; @@ -15,6 +25,29 @@ public class LivePush { this.videoChannel = videoChannel; } + public LivePush(String sn, double lat, double lon, int bearing) { + this.sn = sn; + this.lat = lat; + this.lon = lon; + this.bearing = bearing; + } + + public LivePush(String sn, String videoChannel, double lat, double lon, int bearing) { + this.sn = sn; + this.videoChannel = videoChannel; + this.lat = lat; + this.lon = lon; + this.bearing = bearing; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + public String getSn() { return sn; } @@ -39,12 +72,40 @@ public class LivePush { this.videoChannel = videoChannel; } + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public int getBearing() { + return bearing; + } + + public void setBearing(int bearing) { + this.bearing = bearing; + } + @Override public String toString() { return "LivePush{" + - "sn='" + sn + '\'' + + "id=" + id + + ", sn='" + sn + '\'' + ", type='" + type + '\'' + ", videoChannel='" + videoChannel + '\'' + + ", lat=" + lat + + ", lon=" + lon + + ", bearing=" + bearing + '}'; } } diff --git a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/LiveReceive.java b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/LiveReceive.java new file mode 100644 index 0000000..8d392a3 --- /dev/null +++ b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/model/LiveReceive.java @@ -0,0 +1,69 @@ +package com.mogo.cloud.live.model; + +/** + * 调用服务端接口直播返回数据 + */ +public class LiveReceive { + + //直播摄像头id + private int id; + //直播车机sn + private String sn; + //直播车机纬度 + private double lat; + //直播车机经度 + private double lon; + //直播流url + private String live; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getLive() { + return live; + } + + public void setLive(String live) { + this.live = live; + } + + @Override + public String toString() { + return "LiveReceive{" + + "id=" + id + + ", sn='" + sn + '\'' + + ", lat=" + lat + + ", lon=" + lon + + ", live='" + live + '\'' + + '}'; + } +} diff --git a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/network/LiveApiServer.java b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/network/LiveApiServer.java index 3d3971a..92786ed 100644 --- a/foudations/mogo-live/src/main/java/com/mogo/cloud/live/network/LiveApiServer.java +++ b/foudations/mogo-live/src/main/java/com/mogo/cloud/live/network/LiveApiServer.java @@ -1,6 +1,7 @@ package com.mogo.cloud.live.network; import com.mogo.cloud.live.model.BaseData; +import com.mogo.cloud.live.model.LiveReceive; import java.util.Map; @@ -14,22 +15,42 @@ import retrofit2.http.POST; */ public interface LiveApiServer { /** - * 获取车辆前方直播Url + * 获取特定车辆直播Url * - * @param vehicleHeadLiveMap 请求数据 + * @param designativeVehicleHeadLiveMap 请求数据 * @return {@link BaseData} */ @FormUrlEncoded @POST("/dataSave/integratedServices/app/push/no/livePushAndSwitch/v1") - Observable getVehicleHeadLive(@FieldMap Map vehicleHeadLiveMap); + Observable getDesignativeVehicleLive(@FieldMap Map designativeVehicleHeadLiveMap); + + /** + * 获取前方车辆直播Url + * + * @param frontVehicleHeadLiveMap 请求数据 + * @return {@link BaseData} + */ + @FormUrlEncoded + @POST("yycp-geo-fence-carService/front/car") + Observable> getFrontVehicleLive(@FieldMap Map frontVehicleHeadLiveMap); /** * 获取前方路口直播Url * - * @param intersectionLiveMap 请求数据 + * @param frontIntersectionLiveMap 请求数据 + * @return {@link BaseData} + */ + @FormUrlEncoded + @POST("yycp-geo-fence-carService/front/crossing") + Observable> getFrontIntersectionLive(@FieldMap Map frontIntersectionLiveMap); + + /** + * 获取固定路口摄像头直播Url + * + * @param designativeIntersectionLiveMap 请求数据 * @return {@link BaseData} */ @FormUrlEncoded @POST("") - Observable getIntersectionLive(@FieldMap Map intersectionLiveMap); + Observable> getDesignativeIntersectionLive(@FieldMap Map designativeIntersectionLiveMap); } diff --git a/gradle.properties b/gradle.properties index 1b2fe81..8999ce0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,23 +27,23 @@ SNAPSHOT_REPOSITORY_URL=http://nexus.zhidaoauto.com/repository/maven-snapshots/ USERNAME=xintai PASSWORD=xintai2018 # 编译模式: false - 依赖本地版本, true - 依赖 maven 版本 -RELEASE=true +RELEASE=false # AI CLOUD 云平台 # 工具类 -MOGO_UTILS_VERSION=1.0.58 +MOGO_UTILS_VERSION=1.0.59 # 网络请求 -MOGO_NETWORK_VERSION=1.0.58 +MOGO_NETWORK_VERSION=1.0.59 # 网络DNS -MOGO_HTTPDNS_VERSION=1.0.58 +MOGO_HTTPDNS_VERSION=1.0.59 # 鉴权 -MOGO_PASSPORT_VERSION=1.0.58 +MOGO_PASSPORT_VERSION=1.0.59 # 常链接 -MOGO_SOCKET_VERSION=1.0.58 +MOGO_SOCKET_VERSION=1.0.59 # 数据采集 -MOGO_REALTIME_VERSION=1.0.58 +MOGO_REALTIME_VERSION=1.0.59 # 探路,道路事件发布,获取 -MOGO_TANLU_VERSION=1.0.58 +MOGO_TANLU_VERSION=1.0.59 # 直播推流 -MOGO_LIVE_VERSION=1.0.58 +MOGO_LIVE_VERSION=1.0.59 # 直播拉流 -MOGO_TRAFFICLIVE_VERSION=1.0.58 +MOGO_TRAFFICLIVE_VERSION=1.0.59 diff --git a/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/CloudLocationInfo.java b/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/CloudLocationInfo.java index 0e4126f..d1d0136 100644 --- a/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/CloudLocationInfo.java +++ b/modules/mogo-realtime/src/main/java/com/mogo/realtime/entity/CloudLocationInfo.java @@ -53,10 +53,30 @@ public class CloudLocationInfo implements Parcelable { */ private int vehicleType = 0; + /** + * 道路ID + */ + private String roadId; + + /** + * 车道ID-2D路段 + */ + private String laneId; + + /** + * 车道号:中心线编号为0,中心线右侧编号为负数,3车道通行Road的车道编号,0,-1,-2,-3 + */ + private int laneNum; + + /** + * 限速 + */ + private double rateLimiting; + public CloudLocationInfo() { } - public CloudLocationInfo(CloudLocationInfo info ) { + public CloudLocationInfo(CloudLocationInfo info) { this.lat = info.getLat(); this.lon = info.getLon(); this.heading = info.getHeading(); @@ -65,9 +85,13 @@ public class CloudLocationInfo implements Parcelable { this.alt = info.alt; this.speed = info.speed; this.vehicleType = info.vehicleType; + this.roadId = info.roadId; + this.laneId = info.laneId; + this.laneNum = info.laneNum; + this.rateLimiting = info.rateLimiting; } - protected CloudLocationInfo(Parcel in ) { + protected CloudLocationInfo(Parcel in) { lat = in.readDouble(); lon = in.readDouble(); heading = in.readDouble(); @@ -76,18 +100,26 @@ public class CloudLocationInfo implements Parcelable { alt = in.readDouble(); speed = in.readDouble(); vehicleType = in.readInt(); + roadId = in.readString(); + laneId = in.readString(); + laneNum = in.readInt(); + rateLimiting = in.readDouble(); } @Override - public void writeToParcel( Parcel dest, int flags ) { - dest.writeDouble( lat ); - dest.writeDouble( lon ); - dest.writeDouble( heading ); - dest.writeLong( systemTime ); - dest.writeLong( satelliteTime ); - dest.writeDouble( alt ); - dest.writeDouble( speed ); - dest.writeInt( vehicleType ); + public void writeToParcel(Parcel dest, int flags) { + dest.writeDouble(lat); + dest.writeDouble(lon); + dest.writeDouble(heading); + dest.writeLong(systemTime); + dest.writeLong(satelliteTime); + dest.writeDouble(alt); + dest.writeDouble(speed); + dest.writeInt(vehicleType); + dest.writeString(roadId); + dest.writeString(laneId); + dest.writeInt(laneNum); + dest.writeDouble(rateLimiting); } @Override @@ -95,14 +127,14 @@ public class CloudLocationInfo implements Parcelable { return 0; } - public static final Creator< CloudLocationInfo > CREATOR = new Creator< CloudLocationInfo >() { + public static final Creator CREATOR = new Creator() { @Override - public CloudLocationInfo createFromParcel( Parcel in ) { - return new CloudLocationInfo( in ); + public CloudLocationInfo createFromParcel(Parcel in) { + return new CloudLocationInfo(in); } @Override - public CloudLocationInfo[] newArray( int size ) { + public CloudLocationInfo[] newArray(int size) { return new CloudLocationInfo[size]; } }; @@ -111,7 +143,7 @@ public class CloudLocationInfo implements Parcelable { return lat; } - public void setLat( double lat ) { + public void setLat(double lat) { this.lat = lat; } @@ -119,7 +151,7 @@ public class CloudLocationInfo implements Parcelable { return lon; } - public void setLon( double lon ) { + public void setLon(double lon) { this.lon = lon; } @@ -127,7 +159,7 @@ public class CloudLocationInfo implements Parcelable { return heading; } - public void setHeading( double heading ) { + public void setHeading(double heading) { this.heading = heading; } @@ -135,7 +167,7 @@ public class CloudLocationInfo implements Parcelable { return systemTime; } - public void setSystemTime( long systemTime ) { + public void setSystemTime(long systemTime) { this.systemTime = systemTime; } @@ -143,7 +175,7 @@ public class CloudLocationInfo implements Parcelable { return satelliteTime; } - public void setSatelliteTime( long satelliteTime ) { + public void setSatelliteTime(long satelliteTime) { this.satelliteTime = satelliteTime; } @@ -151,7 +183,7 @@ public class CloudLocationInfo implements Parcelable { return alt; } - public void setAlt( double alt ) { + public void setAlt(double alt) { this.alt = alt; } @@ -159,7 +191,7 @@ public class CloudLocationInfo implements Parcelable { return speed; } - public void setSpeed( double speed ) { + public void setSpeed(double speed) { this.speed = speed; } @@ -171,6 +203,38 @@ public class CloudLocationInfo implements Parcelable { this.vehicleType = vehicleType; } + public String getRoadId() { + return roadId; + } + + public void setRoadId(String roadId) { + this.roadId = roadId; + } + + public String getLaneId() { + return laneId; + } + + public void setLaneId(String laneId) { + this.laneId = laneId; + } + + public int getLaneNum() { + return laneNum; + } + + public void setLaneNum(int laneNum) { + this.laneNum = laneNum; + } + + public double getRateLimiting() { + return rateLimiting; + } + + public void setRateLimiting(double rateLimiting) { + this.rateLimiting = rateLimiting; + } + @Override public String toString() { return "CloudLocationInfo{" + @@ -182,6 +246,10 @@ public class CloudLocationInfo implements Parcelable { ", alt=" + alt + ", speed=" + speed + ", vehicleType=" + vehicleType + + ", roadId='" + roadId + '\'' + + ", laneId='" + laneId + '\'' + + ", laneNum=" + laneNum + + ", rateLimiting=" + rateLimiting + '}'; } @@ -191,21 +259,21 @@ public class CloudLocationInfo implements Parcelable { } @Override - public boolean equals( Object o ) { - if ( this == o ) { + public boolean equals(Object o) { + if (this == o) { return true; } - if ( o == null || getClass() != o.getClass() ) { + if (o == null || getClass() != o.getClass()) { return false; } - CloudLocationInfo that = ( CloudLocationInfo ) o; - return Double.compare( that.lat, lat ) == 0 && - Double.compare( that.lon, lon ) == 0; + CloudLocationInfo that = (CloudLocationInfo) o; + return Double.compare(that.lat, lat) == 0 && + Double.compare(that.lon, lon) == 0; } @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public int hashCode() { - return Objects.hash( lat, lon ); + return Objects.hash(lat, lon); } } diff --git a/modules/mogo-trafficlive/consumer-rules.pro b/modules/mogo-trafficlive/consumer-rules.pro index b58a6ca..0bd704f 100644 --- a/modules/mogo-trafficlive/consumer-rules.pro +++ b/modules/mogo-trafficlive/consumer-rules.pro @@ -1,2 +1,2 @@ --keep class com.mogo.cloud.trafficlive.api.ITrafficLiveCallBack{*;} +-keep class com.mogo.cloud.trafficlive.api.ITrafficCarLiveCallBack{*;} -keep class com.mogo.cloud.trafficlive.api.MoGoAiCloudTrafficLive{*;} \ No newline at end of file diff --git a/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficLiveCallBack.java b/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficCarLiveCallBack.java similarity index 83% rename from modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficLiveCallBack.java rename to modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficCarLiveCallBack.java index ef64aa0..0c702aa 100644 --- a/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficLiveCallBack.java +++ b/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficCarLiveCallBack.java @@ -1,6 +1,6 @@ package com.mogo.cloud.trafficlive.api; -public interface ITrafficLiveCallBack { +public interface ITrafficCarLiveCallBack { default void onLiveConnecting() { diff --git a/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficIntersectionLiveCallBack.java b/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficIntersectionLiveCallBack.java new file mode 100644 index 0000000..774442d --- /dev/null +++ b/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/ITrafficIntersectionLiveCallBack.java @@ -0,0 +1,8 @@ +package com.mogo.cloud.trafficlive.api; + +public interface ITrafficIntersectionLiveCallBack { + + void liveUrlResult(String liveUrl); + + void onError(String errorMsg); +} diff --git a/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/MoGoAiCloudTrafficLive.java b/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/MoGoAiCloudTrafficLive.java index 7c5b420..aa28ccd 100644 --- a/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/MoGoAiCloudTrafficLive.java +++ b/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/api/MoGoAiCloudTrafficLive.java @@ -1,6 +1,5 @@ package com.mogo.cloud.trafficlive.api; -import android.app.Application; import android.view.SurfaceView; import com.mogo.cloud.trafficlive.core.TrafficLiveCurrentManager; @@ -11,37 +10,92 @@ import static com.mogo.cloud.trafficlive.constant.TrafficLiveConstant.TAG; public class MoGoAiCloudTrafficLive { /** - * 查看指定SN车辆直播 + * 查看前方车辆直播 + * + * @param lat 纬度 + * @param lon 经度 + * @param bearing 方向角 + * @param surfaceView 直播界面 + * @param callBack {@link ITrafficCarLiveCallBack}直播回调 */ - public static void viewVehicleHeadLive(Application application, String liveSn, SurfaceView surfaceView, ITrafficLiveCallBack callBack) { + public static void viewFrontVehicleLive(double lat, double lon, int bearing, SurfaceView surfaceView, ITrafficCarLiveCallBack callBack) { try { - TrafficLiveCurrentManager.getInstance().viewVehicleHeadLive(application, liveSn, surfaceView, callBack); + TrafficLiveCurrentManager.getInstance().viewFrontVehicleLive(lat, lon, bearing, surfaceView, callBack); } catch (Exception e) { - Logger.e(TAG, " viewVehicleHeadLive error : " + e); + Logger.e(TAG, " viewFrontVehicleLive error : " + e); + callBack.onError(e != null ? e.getMessage() : "check input param"); + e.printStackTrace(); + } + } + + /** + * 查看指定SN车辆直播 + * + * @param liveSn 直播车辆SN + * @param surfaceView 直播界面 + * @param callBack {@link ITrafficCarLiveCallBack}直播回调 + */ + public static void viewDesignativeVehicleLive(String liveSn, SurfaceView surfaceView, ITrafficCarLiveCallBack callBack) { + try { + TrafficLiveCurrentManager.getInstance().viewDesignativeVehicleLive(liveSn, surfaceView, callBack); + } catch (Exception e) { + Logger.e(TAG, " viewDesignativeVehicleLive error : " + e); + callBack.onError(e != null ? e.getMessage() : "check input param"); e.printStackTrace(); } } /** * 查看前方路口直播 + * + * @param lat 纬度 + * @param lon 经度 + * @param bearing 方向角 + * @param callBack {@link ITrafficIntersectionLiveCallBack}直播回调 */ - public static void viewIntersectionLive(ITrafficLiveCallBack callBack) { - TrafficLiveCurrentManager.getInstance().viewIntersectionLive(callBack); + public static void viewFrontIntersectionLive(double lat, double lon, int bearing, ITrafficIntersectionLiveCallBack callBack) { + try { + TrafficLiveCurrentManager.getInstance().viewFrontIntersectionLive(lat, lon, bearing, callBack); + } catch (Exception e) { + Logger.e(TAG, " viewFrontIntersectionLive error : " + e); + callBack.onError(e != null ? e.getMessage() : "check input param"); + e.printStackTrace(); + } } /** - * 停止观看直播 + * 查看指定路口摄像头直播 + * + * @param cameraId 设备id + * @param lat 纬度 + * @param lon 经度 + * @param callBack {@link ITrafficIntersectionLiveCallBack}直播回调 */ - public static void stopLive(String liveSn) { - TrafficLiveCurrentManager.getInstance().stopLive(liveSn); + public static void viewDesignativeIntersectionLive(int cameraId, double lat, double lon, ITrafficIntersectionLiveCallBack callBack) { + try { + TrafficLiveCurrentManager.getInstance().viewDesignativeIntersectionLive(cameraId, lat, lon, callBack); + } catch (Exception e) { + Logger.e(TAG, " viewDesignativeIntersectionLive error : " + e); + callBack.onError(e != null ? e.getMessage() : "check input param"); + e.printStackTrace(); + } } /** - * 是否在直播中 + * 停止观看车辆直播 + * + * @param liveSn 车辆SN + */ + public static void stopCarLive(String liveSn) { + TrafficLiveCurrentManager.getInstance().stopCarLive(liveSn); + } + + /** + * 车辆是否在直播中 * * @return 直播状态 */ - public static boolean isOnLive() { - return TrafficLiveCurrentManager.getInstance().isOnLive(); + public static boolean isCarOnLive() { + return TrafficLiveCurrentManager.getInstance().isCarOnLive(); } } diff --git a/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/core/TrafficLiveCurrentManager.java b/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/core/TrafficLiveCurrentManager.java index 799c4c8..69e2520 100644 --- a/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/core/TrafficLiveCurrentManager.java +++ b/modules/mogo-trafficlive/src/main/java/com/mogo/cloud/trafficlive/core/TrafficLiveCurrentManager.java @@ -1,7 +1,5 @@ package com.mogo.cloud.trafficlive.core; -import android.app.Application; -import android.os.SystemClock; import android.text.TextUtils; import android.view.SurfaceView; @@ -12,7 +10,8 @@ import com.mogo.cloud.live.manager.MoGoLiveManager; import com.mogo.cloud.live.manager.MoGoLivePushConfig; import com.mogo.cloud.live.manager.RequestLiveManager; import com.mogo.cloud.passport.MoGoAiCloudClient; -import com.mogo.cloud.trafficlive.api.ITrafficLiveCallBack; +import com.mogo.cloud.trafficlive.api.ITrafficCarLiveCallBack; +import com.mogo.cloud.trafficlive.api.ITrafficIntersectionLiveCallBack; import com.mogo.cloud.utils.logger.Logger; import static com.mogo.cloud.live.constant.LiveConstant.LIVE_TYPE_CLOSE; @@ -24,10 +23,7 @@ public class TrafficLiveCurrentManager private static volatile TrafficLiveCurrentManager mInstance; private final RequestLiveManager requestLiveManager; - private ITrafficLiveCallBack trafficLiveCallBack; - private SurfaceView surfaceView; - private String mStreamId; - private boolean isLoginSuccess = false; + private ITrafficCarLiveCallBack trafficLiveCallBack; private TrafficLiveCurrentManager() { requestLiveManager = RequestLiveManager.getInstance(); @@ -45,12 +41,40 @@ public class TrafficLiveCurrentManager return mInstance; } - public boolean isOnLive() { + public boolean isCarOnLive() { return MoGoLiveManager.getInstance().getLiveStatusModel().isPlaying(); } - public void viewVehicleHeadLive(Application application, String liveSn, SurfaceView surfaceView, ITrafficLiveCallBack trafficLiveCallBack) throws Exception { - if (trafficLiveCallBack == null) { + public void viewFrontVehicleLive(double lat, double lon, int bearing, SurfaceView surfaceView, ITrafficCarLiveCallBack callBack) throws Exception { + if (callBack == null) { + throw new Exception("ITrafficLiveCallBack can not be null"); + } + if (surfaceView == null) { + throw new Exception("SurfaceView can not be null"); + } + if (lat == 0.0 || lon == 0.0) { + throw new Exception("param lat and lon can not be 0.0f"); + } + if (bearing < 0) { + throw new Exception("param bearing can not less than 0"); + } + + this.trafficLiveCallBack = callBack; + requestLiveManager.requestFrontVehicleLive(lat, lon, bearing, new IRequestLiveListener() { + @Override + public void onSuccess(String liveSn, String liveUrl, double lat, double lon) { + onVehicleLiveSuccess(liveSn, surfaceView); + } + + @Override + public void onError(Throwable e) { + onVehicleLiveError(e.getMessage()); + } + }); + } + + public void viewDesignativeVehicleLive(String liveSn, SurfaceView surfaceView, ITrafficCarLiveCallBack callBack) throws Exception { + if (callBack == null) { throw new Exception("ITrafficLiveCallBack can not be null"); } if (surfaceView == null) { @@ -60,45 +84,42 @@ public class TrafficLiveCurrentManager throw new Exception("liveSn can not be null"); } - this.trafficLiveCallBack = trafficLiveCallBack; - this.surfaceView = surfaceView; - Logger.i(TAG, "申请拉流 systemClock :" + SystemClock.elapsedRealtime() + " SystemTime : " + System.currentTimeMillis()); - requestLiveManager.requestVehicleHeadLive(LIVE_TYPE_OPEN, liveSn, new IRequestLiveListener() { + this.trafficLiveCallBack = callBack; + requestLiveManager.requestDesignativeVehicleLive(LIVE_TYPE_OPEN, liveSn, new IRequestLiveListener() { @Override public void onSuccess() { - Logger.i(TAG, "主播开始直播了 systemClock :" + SystemClock.elapsedRealtime() + " SystemTime : " + System.currentTimeMillis()); - String sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); - mStreamId = MoGoLiveManager.STREAM_ID_PREFIX + liveSn; - - // 初始化配置文件 - MoGoLivePushConfig mLivePushConfig = MoGoLivePushConfig.getInstance(); - mLivePushConfig.setDevicesId(sn); - - // 登录要查看的SN房间 - MoGoLiveManager.getInstance().loginMultiRoom(liveSn); - - // 直接 查看对应SN的直播 - MoGoLiveManager.getInstance().startLive(surfaceView); - if (TrafficLiveCurrentManager.this.trafficLiveCallBack != null) { - TrafficLiveCurrentManager.this.trafficLiveCallBack.onLive(); - } + onVehicleLiveSuccess(liveSn, surfaceView); } @Override public void onError(Throwable e) { - if (TrafficLiveCurrentManager.this.trafficLiveCallBack != null) { - TrafficLiveCurrentManager.this.trafficLiveCallBack.onError(e.getMessage()); - } + onVehicleLiveError(e.getMessage()); } }); } - public void viewIntersectionLive(ITrafficLiveCallBack callBack) { - + private void onVehicleLiveSuccess(String liveSn, SurfaceView surfaceView) { + String sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); + // 初始化配置文件 + MoGoLivePushConfig mLivePushConfig = MoGoLivePushConfig.getInstance(); + mLivePushConfig.setDevicesId(sn); + // 登录要查看的SN房间 + MoGoLiveManager.getInstance().loginMultiRoom(liveSn); + // 直接 查看对应SN的直播 + MoGoLiveManager.getInstance().startLive(surfaceView); + if (TrafficLiveCurrentManager.this.trafficLiveCallBack != null) { + TrafficLiveCurrentManager.this.trafficLiveCallBack.onLive(); + } } - public void stopLive(String liveSn) { - requestLiveManager.requestVehicleHeadLive(LIVE_TYPE_CLOSE, liveSn, new IRequestLiveListener() { + private void onVehicleLiveError(String errorMsg) { + if (TrafficLiveCurrentManager.this.trafficLiveCallBack != null) { + TrafficLiveCurrentManager.this.trafficLiveCallBack.onError(errorMsg); + } + } + + public void stopCarLive(String liveSn) { + requestLiveManager.requestDesignativeVehicleLive(LIVE_TYPE_CLOSE, liveSn, new IRequestLiveListener() { @Override public void onSuccess() { } @@ -111,10 +132,47 @@ public class TrafficLiveCurrentManager } }); MoGoLiveManager.getInstance().stopLive(); - surfaceView = null; trafficLiveCallBack = null; - isLoginSuccess = false; - mStreamId = null; + } + + public void viewFrontIntersectionLive(double lat, double lon, int bearing, ITrafficIntersectionLiveCallBack callBack) throws Exception { + if (lat == 0.0 || lon == 0.0) { + throw new Exception("param lat and lon can not be 0.0f"); + } + if (bearing < 0) { + throw new Exception("param bearing can not less than 0"); + } + requestLiveManager.requestFrontIntersectionLive(lat, lon, bearing, new IRequestLiveListener() { + @Override + public void onSuccess(String liveUrl) { + callBack.liveUrlResult(liveUrl); + } + + @Override + public void onError(Throwable e) { + callBack.onError(e.getMessage()); + } + }); + } + + public void viewDesignativeIntersectionLive(int cameraId, double lat, double lon, ITrafficIntersectionLiveCallBack callBack) throws Exception { + if (lat == 0.0 || lon == 0.0) { + throw new Exception("param lat and lon can not be 0.0f"); + } + if (cameraId < 0) { + throw new Exception("param bearing can not less than 0"); + } + requestLiveManager.requestDesignativeIntersectionLive(cameraId, lat, lon, new IRequestLiveListener() { + @Override + public void onSuccess(String liveUrl) { + callBack.liveUrlResult(liveUrl); + } + + @Override + public void onError(Throwable e) { + callBack.onError(e.getMessage()); + } + }); } @Override @@ -135,7 +193,6 @@ public class TrafficLiveCurrentManager } } - @Override public void onMultiRoomConnecting() { if (trafficLiveCallBack != null) { @@ -145,7 +202,6 @@ public class TrafficLiveCurrentManager @Override public void onMultiRoomConnected() { - isLoginSuccess = true; if (trafficLiveCallBack != null) { trafficLiveCallBack.onLiveConnected(); } @@ -153,9 +209,9 @@ public class TrafficLiveCurrentManager @Override public void onMultiRoomDisconnected() { - isLoginSuccess = false; if (trafficLiveCallBack != null) { trafficLiveCallBack.onDisConnect(); } } + }