add[声望升级]
This commit is contained in:
@@ -225,6 +225,7 @@ dependencies {
|
||||
api 'com.github.FlyJingFish:GradientTextView:1.2.4'
|
||||
//轮播 一屏显示多个
|
||||
api 'com.github.xiaohaibin:XBanner:androidx_v1.2.6'
|
||||
|
||||
//声网SDK
|
||||
api 'io.agora.rtc:agora-special-full:4.1.1.28'
|
||||
|
||||
}
|
||||
|
||||
@@ -77,7 +77,6 @@ public class CommonAppConfig {
|
||||
public static int alert_time = 1;
|
||||
public static int alert_end_time = 1;
|
||||
|
||||
|
||||
private CommonAppConfig() {
|
||||
|
||||
}
|
||||
|
||||
147
common/src/main/java/com/yunbao/common/manager/SWAuManager.java
Normal file
147
common/src/main/java/com/yunbao/common/manager/SWAuManager.java
Normal file
@@ -0,0 +1,147 @@
|
||||
package com.yunbao.common.manager;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.view.SurfaceView;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import com.yunbao.common.CommonAppContext;
|
||||
import com.yunbao.common.manager.base.BaseCacheManager;
|
||||
import com.yunbao.common.utils.StringUtil;
|
||||
|
||||
import io.agora.rtc2.ChannelMediaOptions;
|
||||
import io.agora.rtc2.Constants;
|
||||
import io.agora.rtc2.IRtcEngineEventHandler;
|
||||
import io.agora.rtc2.RtcEngine;
|
||||
import io.agora.rtc2.RtcEngineConfig;
|
||||
import io.agora.rtc2.video.VideoCanvas;
|
||||
|
||||
/**
|
||||
* 声网主播管理类
|
||||
*/
|
||||
public class SWAuManager extends BaseCacheManager {
|
||||
|
||||
// 填写项目的 App ID,可在声网控制台中生成
|
||||
public static final String shengwang_appId = "4cf0376582d742ac8a96778b25b1079e";
|
||||
// 填写频道名
|
||||
public static final String shengwang_channelName = "12";
|
||||
// 填写声网控制台中生成的临时 Token
|
||||
public static final String shengwang_token = "007eJxSYJi477Xju22xV7ov7GfzzOnbtCU0IuK9+YuwWf2uLPGnl8xRYDBJTjMwNjcztTBKMTcxSky2SLQ0Mze3SDIyTTI0MLdMPWQrltYQyMjw/4kCCyMDBIL4TAyGRiwMlpaWloAAAAD//w/TIFY=";
|
||||
private Activity mContext;
|
||||
public static SWAuManager manager;
|
||||
private RtcEngine mRtcEngine;
|
||||
private FrameLayout audienceContainer; //主播视图
|
||||
private FrameLayout pkContainer1; //pk主播视图1
|
||||
private FrameLayout pkContainer2; //pk主播视图2
|
||||
private FrameLayout pkContainer3; //pk主播视图3
|
||||
private FrameLayout linkUserContainer;//连麦用户视图
|
||||
|
||||
public SWAuManager(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单列
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static SWAuManager get() {
|
||||
if (null == manager) {
|
||||
manager = new SWAuManager(CommonAppContext.sInstance.getBaseContext());
|
||||
}
|
||||
return manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化声网SDK
|
||||
*/
|
||||
public void initRtcEngine(Activity mContext) {
|
||||
this.mContext = mContext;
|
||||
try {
|
||||
// 创建 RtcEngineConfig 对象,并进行配置
|
||||
RtcEngineConfig config = new RtcEngineConfig();
|
||||
config.mContext = mContext;
|
||||
config.mAppId = SWAuManager.shengwang_appId;
|
||||
config.mEventHandler = mRtcEventHandler;
|
||||
// 创建并初始化 RtcEngine
|
||||
mRtcEngine = RtcEngine.create(config);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Check the error.");
|
||||
}
|
||||
mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING); // 直播模式,引擎級別
|
||||
// 启用视频模块
|
||||
mRtcEngine.enableVideo();
|
||||
// 开启本地预览
|
||||
//mRtcEngine.startPreview();
|
||||
}
|
||||
|
||||
/**
|
||||
* guanzhong
|
||||
* 加入房间
|
||||
*/
|
||||
public void joinRoom(String strUid, String token, String channelName) {
|
||||
int uid;
|
||||
if (StringUtil.isEmpty(strUid)) {
|
||||
uid = 0;
|
||||
} else {
|
||||
uid = Integer.parseInt(strUid);
|
||||
}
|
||||
// 创建一个 SurfaceView 对象,并将其作为 FrameLayout 的子对象
|
||||
SurfaceView surfaceView = new SurfaceView(mContext);
|
||||
audienceContainer.addView(surfaceView);
|
||||
|
||||
// 创建 ChannelMediaOptions 对象,并进行配置
|
||||
ChannelMediaOptions options = new ChannelMediaOptions();
|
||||
// 根据场景将用户角色设置为 AUDIENCE (观众)
|
||||
options.clientRoleType = Constants.CLIENT_ROLE_AUDIENCE;
|
||||
// 直播场景下,设置频道场景为 BROADCASTING (直播场景)
|
||||
options.audienceLatencyLevel = Constants.AUDIENCE_LATENCY_LEVEL_LOW_LATENCY; // 觀眾走極速直播
|
||||
|
||||
// 使用临时 Token 加入频道,自行指定用户 ID 并确保其在频道内的唯一性
|
||||
mRtcEngine.joinChannel(token, channelName, uid, options);
|
||||
}
|
||||
|
||||
//远程监听
|
||||
private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() {
|
||||
@Override
|
||||
// 监听频道内的远端用户,获取用户的 uid 信息
|
||||
public void onUserJoined(int uid, int elapsed) {
|
||||
mContext.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// 获取 uid 后,设置远端视频视图
|
||||
setupRemoteVideo(uid);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
//设置对方主播视图
|
||||
public void setupRemoteVideo(int uid) {
|
||||
SurfaceView surfaceView = new SurfaceView(mContext);
|
||||
surfaceView.setZOrderMediaOverlay(true);
|
||||
audienceContainer.addView(surfaceView);
|
||||
// 将 SurfaceView 对象传入声网实时互动 SDK,设置远端视图
|
||||
mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_HIDDEN, uid));
|
||||
}
|
||||
|
||||
public void setAudienceContainer(FrameLayout audienceContainer) {
|
||||
this.audienceContainer = audienceContainer;
|
||||
}
|
||||
|
||||
public void setPkContainer1(FrameLayout pkContainer1) {
|
||||
this.pkContainer1 = pkContainer1;
|
||||
}
|
||||
|
||||
public void setPkContainer2(FrameLayout pkContainer2) {
|
||||
this.pkContainer2 = pkContainer2;
|
||||
}
|
||||
|
||||
public void setPkContainer3(FrameLayout pkContainer3) {
|
||||
this.pkContainer3 = pkContainer3;
|
||||
}
|
||||
|
||||
public void setLinkUserContainer(FrameLayout linkUserContainer) {
|
||||
this.linkUserContainer = linkUserContainer;
|
||||
}
|
||||
}
|
||||
207
common/src/main/java/com/yunbao/common/manager/SWManager.java
Normal file
207
common/src/main/java/com/yunbao/common/manager/SWManager.java
Normal file
@@ -0,0 +1,207 @@
|
||||
package com.yunbao.common.manager;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.view.SurfaceView;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import com.yunbao.common.CommonAppContext;
|
||||
import com.yunbao.common.manager.base.BaseCacheManager;
|
||||
import com.yunbao.common.utils.StringUtil;
|
||||
import com.yunbao.common.utils.ToastUtil;
|
||||
|
||||
import cn.rongcloud.rtc.base.RCRTCParamsType;
|
||||
import io.agora.rtc2.ChannelMediaOptions;
|
||||
import io.agora.rtc2.Constants;
|
||||
import io.agora.rtc2.IRtcEngineEventHandler;
|
||||
import io.agora.rtc2.RtcEngine;
|
||||
import io.agora.rtc2.RtcEngineConfig;
|
||||
import io.agora.rtc2.video.VideoCanvas;
|
||||
import io.agora.rtc2.video.VideoEncoderConfiguration;
|
||||
|
||||
/**
|
||||
* 声网主播管理类
|
||||
*/
|
||||
public class SWManager extends BaseCacheManager {
|
||||
|
||||
// 填写项目的 App ID,可在声网控制台中生成
|
||||
public static final String shengwang_appId = "4cf0376582d742ac8a96778b25b1079e";
|
||||
// 填写频道名
|
||||
public static final String shengwang_channelName = "12";
|
||||
// 填写声网控制台中生成的临时 Token
|
||||
public static final String shengwang_token = "007eJxTYOD6Iv3buTHm6666BKY1Cr7mUZU3tY0eHH5qbF4jv5nNukqBwSQ5zcDY3MzUwijF3MQoMdki0dLM3Nwiycg0ydDA3DL1xX/RtIZARgb+3ExWRgYIBPGZGAyNGBgAhDMb8Q==";
|
||||
private Activity mContext;
|
||||
public static SWManager manager;
|
||||
private RtcEngine mRtcEngine;
|
||||
private int uid;
|
||||
VideoEncoderConfiguration cfg;
|
||||
private FrameLayout anchorContainer; //主播视图
|
||||
private FrameLayout pkContainer1; //pk主播视图1
|
||||
private FrameLayout pkContainer2; //pk主播视图2
|
||||
private FrameLayout pkContainer3; //pk主播视图3
|
||||
private FrameLayout linkUserContainer;//连麦用户视图
|
||||
private onRtcEngineListener onRtcEngineListener;
|
||||
|
||||
public void setOnRtcEngineListener(SWManager.onRtcEngineListener onRtcEngineListener) {
|
||||
this.onRtcEngineListener = onRtcEngineListener;
|
||||
}
|
||||
|
||||
public SWManager(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单列
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static SWManager get() {
|
||||
if (null == manager) {
|
||||
manager = new SWManager(CommonAppContext.sInstance.getBaseContext());
|
||||
}
|
||||
return manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化声网SDK
|
||||
*/
|
||||
public void initRtcEngine(Activity mContext, String strUid) {
|
||||
this.mContext = mContext;
|
||||
if (StringUtil.isEmpty(strUid)) {
|
||||
uid = 0;
|
||||
} else {
|
||||
uid = Integer.parseInt(strUid);
|
||||
}
|
||||
try {
|
||||
// 创建 RtcEngineConfig 对象,并进行配置
|
||||
RtcEngineConfig config = new RtcEngineConfig();
|
||||
config.mContext = mContext;
|
||||
config.mAppId = SWManager.shengwang_appId;
|
||||
config.mEventHandler = mRtcEventHandler;
|
||||
// 创建并初始化 RtcEngine
|
||||
mRtcEngine = RtcEngine.create(config);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Check the error.");
|
||||
}
|
||||
mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING);
|
||||
// 启用视频模块
|
||||
mRtcEngine.enableVideo();
|
||||
// 开启本地预览
|
||||
mRtcEngine.startPreview();
|
||||
|
||||
cfg = new VideoEncoderConfiguration();
|
||||
//设置默认分辨率
|
||||
switch (IMLoginManager.get(mContext).getSelectClarity()) {
|
||||
case 0:
|
||||
cfg.dimensions = VideoEncoderConfiguration.VD_840x480;
|
||||
break;
|
||||
case 1:
|
||||
cfg.dimensions = VideoEncoderConfiguration.VD_1280x720;
|
||||
break;
|
||||
case 2:
|
||||
cfg.dimensions = VideoEncoderConfiguration.VD_1920x1080;
|
||||
break;
|
||||
}
|
||||
cfg.frameRate = 24;
|
||||
cfg.bitrate = 0;
|
||||
cfg.mirrorMode = VideoEncoderConfiguration.MIRROR_MODE_TYPE.MIRROR_MODE_ENABLED; //镜像
|
||||
mRtcEngine.setVideoEncoderConfiguration(cfg);
|
||||
|
||||
// 创建一个 SurfaceView 对象,并将其作为 FrameLayout 的子对象
|
||||
SurfaceView surfaceView = new SurfaceView(mContext);
|
||||
anchorContainer.addView(surfaceView);
|
||||
// 设置视图
|
||||
mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_HIDDEN, uid));
|
||||
}
|
||||
|
||||
public void setDimensions(int selectClarity) {
|
||||
if (cfg != null && mRtcEngine != null) {
|
||||
switch (selectClarity) {
|
||||
case 0:
|
||||
cfg.dimensions = VideoEncoderConfiguration.VD_840x480;
|
||||
break;
|
||||
case 1:
|
||||
cfg.dimensions = VideoEncoderConfiguration.VD_1280x720;
|
||||
break;
|
||||
case 2:
|
||||
cfg.dimensions = VideoEncoderConfiguration.VD_1920x1080;
|
||||
break;
|
||||
}
|
||||
mRtcEngine.setVideoEncoderConfiguration(cfg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 创建房间
|
||||
*/
|
||||
public void createRoom(String token, String channelName) {
|
||||
ChannelMediaOptions options = new ChannelMediaOptions();
|
||||
// 设置角色 BROADCASTER (主播) 或 AUDIENCE (观众)
|
||||
options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER;
|
||||
// 加入频道
|
||||
mRtcEngine.joinChannel(token, channelName, uid, options);
|
||||
}
|
||||
|
||||
//远程监听
|
||||
private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() {
|
||||
@Override
|
||||
// 监听频道内的远端用户,获取用户的 uid 信息
|
||||
public void onUserJoined(int uid, int elapsed) {
|
||||
mContext.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// 获取 uid 后,设置远端视频视图
|
||||
setupRemoteVideo(uid);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onJoinChannelSuccess(String channel, int uid, int elapsed) {
|
||||
super.onJoinChannelSuccess(channel, uid, elapsed);
|
||||
if (onRtcEngineListener != null) {
|
||||
onRtcEngineListener.onOpenSuccess(channel, uid);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int err) {
|
||||
super.onError(err);
|
||||
ToastUtil.show("onError:" + err);
|
||||
}
|
||||
};
|
||||
|
||||
//设置对方主播视图
|
||||
private void setupRemoteVideo(int uid) {
|
||||
SurfaceView surfaceView = new SurfaceView(mContext);
|
||||
surfaceView.setZOrderMediaOverlay(true);
|
||||
pkContainer1.addView(surfaceView);
|
||||
// 将 SurfaceView 对象传入声网实时互动 SDK,设置远端视图
|
||||
mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, uid));
|
||||
}
|
||||
|
||||
public void setAnchorContainer(FrameLayout anchorContainer) {
|
||||
this.anchorContainer = anchorContainer;
|
||||
}
|
||||
|
||||
public interface onRtcEngineListener {
|
||||
void onOpenSuccess(String channel, int uid);
|
||||
}
|
||||
|
||||
public void setPkContainer1(FrameLayout pkContainer1) {
|
||||
this.pkContainer1 = pkContainer1;
|
||||
}
|
||||
|
||||
public void setPkContainer2(FrameLayout pkContainer2) {
|
||||
this.pkContainer2 = pkContainer2;
|
||||
}
|
||||
|
||||
public void setPkContainer3(FrameLayout pkContainer3) {
|
||||
this.pkContainer3 = pkContainer3;
|
||||
}
|
||||
|
||||
public void setLinkUserContainer(FrameLayout linkUserContainer) {
|
||||
this.linkUserContainer = linkUserContainer;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user