add new func of live module and realTime add new field

This commit is contained in:
zhongchao
2021-04-01 16:05:51 +08:00
parent 3a5281aa9f
commit d4792ce2ac
17 changed files with 623 additions and 128 deletions

View File

@@ -3,6 +3,7 @@
<words> <words>
<w>amap</w> <w>amap</w>
<w>coor</w> <w>coor</w>
<w>designative</w>
<w>mogo</w> <w>mogo</w>
</words> </words>
</dictionary> </dictionary>

View File

@@ -10,14 +10,13 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import android.widget.ToggleButton; import android.widget.ToggleButton;
import com.mogo.cloud.trafficlive.api.ITrafficCarLiveCallBack;
import com.mogo.cloud.trafficlive.api.ITrafficLiveCallBack;
import com.mogo.cloud.trafficlive.api.MoGoAiCloudTrafficLive; import com.mogo.cloud.trafficlive.api.MoGoAiCloudTrafficLive;
import com.mogo.cloud.wifi.IWifiStateListener; import com.mogo.cloud.wifi.IWifiStateListener;
import com.mogo.cloud.wifi.WifiStateManager; 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 String TAG = "LiveActivity";
private SurfaceView surfaceView; private SurfaceView surfaceView;
@@ -38,9 +37,10 @@ public class LivePlayActivity extends AppCompatActivity implements ITrafficLiveC
Toast.makeText(getApplicationContext(), buttonView.getText(), Toast.LENGTH_SHORT).show(); Toast.makeText(getApplicationContext(), buttonView.getText(), Toast.LENGTH_SHORT).show();
if (isChecked) { if (isChecked) {
liveSn = etLookRoomId.getText().toString().trim(); 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 { } else {
MoGoAiCloudTrafficLive.stopLive(liveSn); MoGoAiCloudTrafficLive.stopCarLive(liveSn);
} }
}); });
WifiStateManager.getInstance().registerWifiStateListener(this); WifiStateManager.getInstance().registerWifiStateListener(this);
@@ -49,7 +49,7 @@ public class LivePlayActivity extends AppCompatActivity implements ITrafficLiveC
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
MoGoAiCloudTrafficLive.stopLive(liveSn); MoGoAiCloudTrafficLive.stopCarLive(liveSn);
WifiStateManager.getInstance().unRegisterWifiStateListener(this); WifiStateManager.getInstance().unRegisterWifiStateListener(this);
} }

View File

@@ -7,18 +7,17 @@ import android.util.Log;
import com.mogo.cloud.live.listener.ILiveStatusListener; import com.mogo.cloud.live.listener.ILiveStatusListener;
import com.mogo.cloud.live.manager.LiveStreamManagerImpl; import com.mogo.cloud.live.manager.LiveStreamManagerImpl;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig; 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.trafficlive.api.MoGoAiCloudTrafficLive;
import com.mogo.cloud.utils.logger.Logger; import com.mogo.cloud.utils.logger.Logger;
import com.mogo.cloud.wifi.IWifiStateListener; import com.mogo.cloud.wifi.IWifiStateListener;
import com.mogo.cloud.wifi.WifiStateManager;
/** /**
* 推流和拉流页面 * 推流和拉流页面
*/ */
public class LivePlayAndPushActivity extends BaseLiveActivity public class LivePlayAndPushActivity extends BaseLiveActivity
implements ITrafficLiveCallBack, IWifiStateListener { implements ITrafficCarLiveCallBack, IWifiStateListener {
public static final String TAG = "LivePlayAndPushActivity"; public static final String TAG = "LivePlayAndPushActivity";
private String liveSn; private String liveSn;
@@ -90,10 +89,9 @@ public class LivePlayAndPushActivity extends BaseLiveActivity
public void togglePlay(boolean isPlay) { public void togglePlay(boolean isPlay) {
if (isPlay) { if (isPlay) {
liveSn = etLookRoomId.getText().toString().trim(); liveSn = etLookRoomId.getText().toString().trim();
MoGoAiCloudTrafficLive.viewVehicleHeadLive(this.getApplication(), MoGoAiCloudTrafficLive.viewDesignativeVehicleLive(liveSn, surfacePlayView, this);
liveSn, surfacePlayView, this);
} else { } else {
MoGoAiCloudTrafficLive.stopLive(liveSn); MoGoAiCloudTrafficLive.stopCarLive(liveSn);
} }
} }
@@ -117,7 +115,7 @@ public class LivePlayAndPushActivity extends BaseLiveActivity
liveStreamManager.release(); liveStreamManager.release();
} }
MoGoAiCloudTrafficLive.stopLive(liveSn); MoGoAiCloudTrafficLive.stopCarLive(liveSn);
// WifiStateManager.getInstance().unRegisterWifiStateListener(this); // WifiStateManager.getInstance().unRegisterWifiStateListener(this);
} }

View File

@@ -90,7 +90,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="直播SDK观看测试" android:text="直播SDK观看测试"
android:visibility="gone" /> android:visibility="visible" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View File

@@ -2,7 +2,14 @@ package com.mogo.cloud.live.listener;
public interface IRequestLiveListener { 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); void onError(Throwable e);
} }

View File

@@ -5,6 +5,7 @@ import com.mogo.cloud.live.constant.LiveConstant;
import com.mogo.cloud.live.listener.IRequestLiveListener; import com.mogo.cloud.live.listener.IRequestLiveListener;
import com.mogo.cloud.live.model.BaseData; import com.mogo.cloud.live.model.BaseData;
import com.mogo.cloud.live.model.LivePush; 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.live.network.LiveApiServer;
import com.mogo.cloud.network.NetConstants; import com.mogo.cloud.network.NetConstants;
import com.mogo.cloud.network.RetrofitFactory; import com.mogo.cloud.network.RetrofitFactory;
@@ -32,7 +33,7 @@ public class RequestLiveManager {
private final LiveApiServer liveApiServer; private final LiveApiServer liveApiServer;
private RequestLiveManager() { private RequestLiveManager() {
liveApiServer = RetrofitFactory.INSTANCE.getInstance(NetConstants.DEVA_HOST) liveApiServer = RetrofitFactory.INSTANCE.getInstance(NetConstants.DEVA_HOST) //todo 涉及直播接口 没有对HttpDNS进行配置
.create(LiveApiServer.class); .create(LiveApiServer.class);
} }
@@ -50,18 +51,18 @@ public class RequestLiveManager {
/** /**
* 请求服务器查看指定车机开启或关闭直播 * 请求服务器查看指定车机开启或关闭直播
* *
* @param type * @param type 0:open 1:close
* @param liveSn * @param liveSn 直播SN
* @param requestLiveListener * @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(); Gson gson = new Gson();
LivePush livePush = new LivePush(liveSn, type, FRONT_CAMERA); LivePush livePush = new LivePush(liveSn, type, FRONT_CAMERA);
String sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn(); String sn = MoGoAiCloudClient.getInstance().getAiCloudClientConfig().getSn();
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("sn", sn); map.put("sn", sn);
map.put("data", gson.toJson(livePush)); map.put("data", gson.toJson(livePush));
liveApiServer.getVehicleHeadLive(map) liveApiServer.getDesignativeVehicleLive(map)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseData>() { .subscribe(new Observer<BaseData>() {
@@ -82,7 +83,153 @@ public class RequestLiveManager {
if (requestLiveListener != null) { if (requestLiveListener != null) {
requestLiveListener.onError(e); 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<String, String> 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<BaseData<LiveReceive>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseData<LiveReceive> 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<String, String> 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<BaseData<LiveReceive>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseData<LiveReceive> 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<String, String> 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<BaseData<LiveReceive>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseData<LiveReceive> 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 @Override

View File

@@ -4,10 +4,11 @@ import com.elegant.network.NetConstants;
import java.io.Serializable; import java.io.Serializable;
public class BaseData implements Serializable, Cloneable { public class BaseData<T> implements Serializable, Cloneable {
public int code = NetConstants.NO_DATA; public int code = NetConstants.NO_DATA;
public String msg; public String msg;
public T result;
public BaseData clone() { public BaseData clone() {
BaseData obj = null; BaseData obj = null;
@@ -18,4 +19,8 @@ public class BaseData implements Serializable, Cloneable {
} }
return obj; return obj;
} }
public T getT() {
return result;
}
} }

View File

@@ -5,9 +5,19 @@ package com.mogo.cloud.live.model;
*/ */
public class LivePush { public class LivePush {
private String sn; private int id; //路口摄像头id
private String type; private String sn; //直播车机sn
private String type; //直播类型 0开启直播 1关闭直播
private String videoChannel; //C_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) { public LivePush(String sn, String type, String videoChannel) {
this.sn = sn; this.sn = sn;
@@ -15,6 +25,29 @@ public class LivePush {
this.videoChannel = videoChannel; 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() { public String getSn() {
return sn; return sn;
} }
@@ -39,12 +72,40 @@ public class LivePush {
this.videoChannel = videoChannel; 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 @Override
public String toString() { public String toString() {
return "LivePush{" + return "LivePush{" +
"sn='" + sn + '\'' + "id=" + id +
", sn='" + sn + '\'' +
", type='" + type + '\'' + ", type='" + type + '\'' +
", videoChannel='" + videoChannel + '\'' + ", videoChannel='" + videoChannel + '\'' +
", lat=" + lat +
", lon=" + lon +
", bearing=" + bearing +
'}'; '}';
} }
} }

View File

@@ -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 + '\'' +
'}';
}
}

View File

@@ -1,6 +1,7 @@
package com.mogo.cloud.live.network; package com.mogo.cloud.live.network;
import com.mogo.cloud.live.model.BaseData; import com.mogo.cloud.live.model.BaseData;
import com.mogo.cloud.live.model.LiveReceive;
import java.util.Map; import java.util.Map;
@@ -14,22 +15,42 @@ import retrofit2.http.POST;
*/ */
public interface LiveApiServer { public interface LiveApiServer {
/** /**
* 获取车辆前方直播Url * 获取特定车辆直播Url
* *
* @param vehicleHeadLiveMap 请求数据 * @param designativeVehicleHeadLiveMap 请求数据
* @return {@link BaseData} * @return {@link BaseData}
*/ */
@FormUrlEncoded @FormUrlEncoded
@POST("/dataSave/integratedServices/app/push/no/livePushAndSwitch/v1") @POST("/dataSave/integratedServices/app/push/no/livePushAndSwitch/v1")
Observable<BaseData> getVehicleHeadLive(@FieldMap Map<String, String> vehicleHeadLiveMap); Observable<BaseData> getDesignativeVehicleLive(@FieldMap Map<String, String> designativeVehicleHeadLiveMap);
/**
* 获取前方车辆直播Url
*
* @param frontVehicleHeadLiveMap 请求数据
* @return {@link BaseData}
*/
@FormUrlEncoded
@POST("yycp-geo-fence-carService/front/car")
Observable<BaseData<LiveReceive>> getFrontVehicleLive(@FieldMap Map<String, String> frontVehicleHeadLiveMap);
/** /**
* 获取前方路口直播Url * 获取前方路口直播Url
* *
* @param intersectionLiveMap 请求数据 * @param frontIntersectionLiveMap 请求数据
* @return {@link BaseData}
*/
@FormUrlEncoded
@POST("yycp-geo-fence-carService/front/crossing")
Observable<BaseData<LiveReceive>> getFrontIntersectionLive(@FieldMap Map<String, String> frontIntersectionLiveMap);
/**
* 获取固定路口摄像头直播Url
*
* @param designativeIntersectionLiveMap 请求数据
* @return {@link BaseData} * @return {@link BaseData}
*/ */
@FormUrlEncoded @FormUrlEncoded
@POST("") @POST("")
Observable<BaseData> getIntersectionLive(@FieldMap Map<String, String> intersectionLiveMap); Observable<BaseData<LiveReceive>> getDesignativeIntersectionLive(@FieldMap Map<String, String> designativeIntersectionLiveMap);
} }

View File

@@ -27,23 +27,23 @@ SNAPSHOT_REPOSITORY_URL=http://nexus.zhidaoauto.com/repository/maven-snapshots/
USERNAME=xintai USERNAME=xintai
PASSWORD=xintai2018 PASSWORD=xintai2018
# 编译模式: false - 依赖本地版本, true - 依赖 maven 版本 # 编译模式: false - 依赖本地版本, true - 依赖 maven 版本
RELEASE=true RELEASE=false
# AI CLOUD 云平台 # 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 # 网络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

View File

@@ -53,10 +53,30 @@ public class CloudLocationInfo implements Parcelable {
*/ */
private int vehicleType = 0; 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() {
} }
public CloudLocationInfo(CloudLocationInfo info ) { public CloudLocationInfo(CloudLocationInfo info) {
this.lat = info.getLat(); this.lat = info.getLat();
this.lon = info.getLon(); this.lon = info.getLon();
this.heading = info.getHeading(); this.heading = info.getHeading();
@@ -65,9 +85,13 @@ public class CloudLocationInfo implements Parcelable {
this.alt = info.alt; this.alt = info.alt;
this.speed = info.speed; this.speed = info.speed;
this.vehicleType = info.vehicleType; 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(); lat = in.readDouble();
lon = in.readDouble(); lon = in.readDouble();
heading = in.readDouble(); heading = in.readDouble();
@@ -76,18 +100,26 @@ public class CloudLocationInfo implements Parcelable {
alt = in.readDouble(); alt = in.readDouble();
speed = in.readDouble(); speed = in.readDouble();
vehicleType = in.readInt(); vehicleType = in.readInt();
roadId = in.readString();
laneId = in.readString();
laneNum = in.readInt();
rateLimiting = in.readDouble();
} }
@Override @Override
public void writeToParcel( Parcel dest, int flags ) { public void writeToParcel(Parcel dest, int flags) {
dest.writeDouble( lat ); dest.writeDouble(lat);
dest.writeDouble( lon ); dest.writeDouble(lon);
dest.writeDouble( heading ); dest.writeDouble(heading);
dest.writeLong( systemTime ); dest.writeLong(systemTime);
dest.writeLong( satelliteTime ); dest.writeLong(satelliteTime);
dest.writeDouble( alt ); dest.writeDouble(alt);
dest.writeDouble( speed ); dest.writeDouble(speed);
dest.writeInt( vehicleType ); dest.writeInt(vehicleType);
dest.writeString(roadId);
dest.writeString(laneId);
dest.writeInt(laneNum);
dest.writeDouble(rateLimiting);
} }
@Override @Override
@@ -95,14 +127,14 @@ public class CloudLocationInfo implements Parcelable {
return 0; return 0;
} }
public static final Creator< CloudLocationInfo > CREATOR = new Creator< CloudLocationInfo >() { public static final Creator<CloudLocationInfo> CREATOR = new Creator<CloudLocationInfo>() {
@Override @Override
public CloudLocationInfo createFromParcel( Parcel in ) { public CloudLocationInfo createFromParcel(Parcel in) {
return new CloudLocationInfo( in ); return new CloudLocationInfo(in);
} }
@Override @Override
public CloudLocationInfo[] newArray( int size ) { public CloudLocationInfo[] newArray(int size) {
return new CloudLocationInfo[size]; return new CloudLocationInfo[size];
} }
}; };
@@ -111,7 +143,7 @@ public class CloudLocationInfo implements Parcelable {
return lat; return lat;
} }
public void setLat( double lat ) { public void setLat(double lat) {
this.lat = lat; this.lat = lat;
} }
@@ -119,7 +151,7 @@ public class CloudLocationInfo implements Parcelable {
return lon; return lon;
} }
public void setLon( double lon ) { public void setLon(double lon) {
this.lon = lon; this.lon = lon;
} }
@@ -127,7 +159,7 @@ public class CloudLocationInfo implements Parcelable {
return heading; return heading;
} }
public void setHeading( double heading ) { public void setHeading(double heading) {
this.heading = heading; this.heading = heading;
} }
@@ -135,7 +167,7 @@ public class CloudLocationInfo implements Parcelable {
return systemTime; return systemTime;
} }
public void setSystemTime( long systemTime ) { public void setSystemTime(long systemTime) {
this.systemTime = systemTime; this.systemTime = systemTime;
} }
@@ -143,7 +175,7 @@ public class CloudLocationInfo implements Parcelable {
return satelliteTime; return satelliteTime;
} }
public void setSatelliteTime( long satelliteTime ) { public void setSatelliteTime(long satelliteTime) {
this.satelliteTime = satelliteTime; this.satelliteTime = satelliteTime;
} }
@@ -151,7 +183,7 @@ public class CloudLocationInfo implements Parcelable {
return alt; return alt;
} }
public void setAlt( double alt ) { public void setAlt(double alt) {
this.alt = alt; this.alt = alt;
} }
@@ -159,7 +191,7 @@ public class CloudLocationInfo implements Parcelable {
return speed; return speed;
} }
public void setSpeed( double speed ) { public void setSpeed(double speed) {
this.speed = speed; this.speed = speed;
} }
@@ -171,6 +203,38 @@ public class CloudLocationInfo implements Parcelable {
this.vehicleType = vehicleType; 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 @Override
public String toString() { public String toString() {
return "CloudLocationInfo{" + return "CloudLocationInfo{" +
@@ -182,6 +246,10 @@ public class CloudLocationInfo implements Parcelable {
", alt=" + alt + ", alt=" + alt +
", speed=" + speed + ", speed=" + speed +
", vehicleType=" + vehicleType + ", vehicleType=" + vehicleType +
", roadId='" + roadId + '\'' +
", laneId='" + laneId + '\'' +
", laneNum=" + laneNum +
", rateLimiting=" + rateLimiting +
'}'; '}';
} }
@@ -191,21 +259,21 @@ public class CloudLocationInfo implements Parcelable {
} }
@Override @Override
public boolean equals( Object o ) { public boolean equals(Object o) {
if ( this == o ) { if (this == o) {
return true; return true;
} }
if ( o == null || getClass() != o.getClass() ) { if (o == null || getClass() != o.getClass()) {
return false; return false;
} }
CloudLocationInfo that = ( CloudLocationInfo ) o; CloudLocationInfo that = (CloudLocationInfo) o;
return Double.compare( that.lat, lat ) == 0 && return Double.compare(that.lat, lat) == 0 &&
Double.compare( that.lon, lon ) == 0; Double.compare(that.lon, lon) == 0;
} }
@RequiresApi(api = Build.VERSION_CODES.KITKAT) @RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash( lat, lon ); return Objects.hash(lat, lon);
} }
} }

View File

@@ -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{*;} -keep class com.mogo.cloud.trafficlive.api.MoGoAiCloudTrafficLive{*;}

View File

@@ -1,6 +1,6 @@
package com.mogo.cloud.trafficlive.api; package com.mogo.cloud.trafficlive.api;
public interface ITrafficLiveCallBack { public interface ITrafficCarLiveCallBack {
default void onLiveConnecting() { default void onLiveConnecting() {

View File

@@ -0,0 +1,8 @@
package com.mogo.cloud.trafficlive.api;
public interface ITrafficIntersectionLiveCallBack {
void liveUrlResult(String liveUrl);
void onError(String errorMsg);
}

View File

@@ -1,6 +1,5 @@
package com.mogo.cloud.trafficlive.api; package com.mogo.cloud.trafficlive.api;
import android.app.Application;
import android.view.SurfaceView; import android.view.SurfaceView;
import com.mogo.cloud.trafficlive.core.TrafficLiveCurrentManager; import com.mogo.cloud.trafficlive.core.TrafficLiveCurrentManager;
@@ -11,37 +10,92 @@ import static com.mogo.cloud.trafficlive.constant.TrafficLiveConstant.TAG;
public class MoGoAiCloudTrafficLive { 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 { try {
TrafficLiveCurrentManager.getInstance().viewVehicleHeadLive(application, liveSn, surfaceView, callBack); TrafficLiveCurrentManager.getInstance().viewFrontVehicleLive(lat, lon, bearing, surfaceView, callBack);
} catch (Exception e) { } 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(); e.printStackTrace();
} }
} }
/** /**
* 查看前方路口直播 * 查看前方路口直播
*
* @param lat 纬度
* @param lon 经度
* @param bearing 方向角
* @param callBack {@link ITrafficIntersectionLiveCallBack}直播回调
*/ */
public static void viewIntersectionLive(ITrafficLiveCallBack callBack) { public static void viewFrontIntersectionLive(double lat, double lon, int bearing, ITrafficIntersectionLiveCallBack callBack) {
TrafficLiveCurrentManager.getInstance().viewIntersectionLive(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) { public static void viewDesignativeIntersectionLive(int cameraId, double lat, double lon, ITrafficIntersectionLiveCallBack callBack) {
TrafficLiveCurrentManager.getInstance().stopLive(liveSn); 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 直播状态 * @return 直播状态
*/ */
public static boolean isOnLive() { public static boolean isCarOnLive() {
return TrafficLiveCurrentManager.getInstance().isOnLive(); return TrafficLiveCurrentManager.getInstance().isCarOnLive();
} }
} }

View File

@@ -1,7 +1,5 @@
package com.mogo.cloud.trafficlive.core; package com.mogo.cloud.trafficlive.core;
import android.app.Application;
import android.os.SystemClock;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.SurfaceView; 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.MoGoLivePushConfig;
import com.mogo.cloud.live.manager.RequestLiveManager; import com.mogo.cloud.live.manager.RequestLiveManager;
import com.mogo.cloud.passport.MoGoAiCloudClient; 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 com.mogo.cloud.utils.logger.Logger;
import static com.mogo.cloud.live.constant.LiveConstant.LIVE_TYPE_CLOSE; import static com.mogo.cloud.live.constant.LiveConstant.LIVE_TYPE_CLOSE;
@@ -24,10 +23,7 @@ public class TrafficLiveCurrentManager
private static volatile TrafficLiveCurrentManager mInstance; private static volatile TrafficLiveCurrentManager mInstance;
private final RequestLiveManager requestLiveManager; private final RequestLiveManager requestLiveManager;
private ITrafficLiveCallBack trafficLiveCallBack; private ITrafficCarLiveCallBack trafficLiveCallBack;
private SurfaceView surfaceView;
private String mStreamId;
private boolean isLoginSuccess = false;
private TrafficLiveCurrentManager() { private TrafficLiveCurrentManager() {
requestLiveManager = RequestLiveManager.getInstance(); requestLiveManager = RequestLiveManager.getInstance();
@@ -45,12 +41,40 @@ public class TrafficLiveCurrentManager
return mInstance; return mInstance;
} }
public boolean isOnLive() { public boolean isCarOnLive() {
return MoGoLiveManager.getInstance().getLiveStatusModel().isPlaying(); return MoGoLiveManager.getInstance().getLiveStatusModel().isPlaying();
} }
public void viewVehicleHeadLive(Application application, String liveSn, SurfaceView surfaceView, ITrafficLiveCallBack trafficLiveCallBack) throws Exception { public void viewFrontVehicleLive(double lat, double lon, int bearing, SurfaceView surfaceView, ITrafficCarLiveCallBack callBack) throws Exception {
if (trafficLiveCallBack == null) { 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"); throw new Exception("ITrafficLiveCallBack can not be null");
} }
if (surfaceView == null) { if (surfaceView == null) {
@@ -60,45 +84,42 @@ public class TrafficLiveCurrentManager
throw new Exception("liveSn can not be null"); throw new Exception("liveSn can not be null");
} }
this.trafficLiveCallBack = trafficLiveCallBack; this.trafficLiveCallBack = callBack;
this.surfaceView = surfaceView; requestLiveManager.requestDesignativeVehicleLive(LIVE_TYPE_OPEN, liveSn, new IRequestLiveListener() {
Logger.i(TAG, "申请拉流 systemClock :" + SystemClock.elapsedRealtime() + " SystemTime : " + System.currentTimeMillis());
requestLiveManager.requestVehicleHeadLive(LIVE_TYPE_OPEN, liveSn, new IRequestLiveListener() {
@Override @Override
public void onSuccess() { public void onSuccess() {
Logger.i(TAG, "主播开始直播了 systemClock :" + SystemClock.elapsedRealtime() + " SystemTime : " + System.currentTimeMillis()); onVehicleLiveSuccess(liveSn, surfaceView);
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();
}
} }
@Override @Override
public void onError(Throwable e) { public void onError(Throwable e) {
if (TrafficLiveCurrentManager.this.trafficLiveCallBack != null) { onVehicleLiveError(e.getMessage());
TrafficLiveCurrentManager.this.trafficLiveCallBack.onError(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) { private void onVehicleLiveError(String errorMsg) {
requestLiveManager.requestVehicleHeadLive(LIVE_TYPE_CLOSE, liveSn, new IRequestLiveListener() { if (TrafficLiveCurrentManager.this.trafficLiveCallBack != null) {
TrafficLiveCurrentManager.this.trafficLiveCallBack.onError(errorMsg);
}
}
public void stopCarLive(String liveSn) {
requestLiveManager.requestDesignativeVehicleLive(LIVE_TYPE_CLOSE, liveSn, new IRequestLiveListener() {
@Override @Override
public void onSuccess() { public void onSuccess() {
} }
@@ -111,10 +132,47 @@ public class TrafficLiveCurrentManager
} }
}); });
MoGoLiveManager.getInstance().stopLive(); MoGoLiveManager.getInstance().stopLive();
surfaceView = null;
trafficLiveCallBack = 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 @Override
@@ -135,7 +193,6 @@ public class TrafficLiveCurrentManager
} }
} }
@Override @Override
public void onMultiRoomConnecting() { public void onMultiRoomConnecting() {
if (trafficLiveCallBack != null) { if (trafficLiveCallBack != null) {
@@ -145,7 +202,6 @@ public class TrafficLiveCurrentManager
@Override @Override
public void onMultiRoomConnected() { public void onMultiRoomConnected() {
isLoginSuccess = true;
if (trafficLiveCallBack != null) { if (trafficLiveCallBack != null) {
trafficLiveCallBack.onLiveConnected(); trafficLiveCallBack.onLiveConnected();
} }
@@ -153,9 +209,9 @@ public class TrafficLiveCurrentManager
@Override @Override
public void onMultiRoomDisconnected() { public void onMultiRoomDisconnected() {
isLoginSuccess = false;
if (trafficLiveCallBack != null) { if (trafficLiveCallBack != null) {
trafficLiveCallBack.onDisConnect(); trafficLiveCallBack.onDisConnect();
} }
} }
} }