add[声望升级]

This commit is contained in:
Martin
2024-04-10 18:31:00 +08:00
parent a100ab1a4a
commit 5922f4c08b
15 changed files with 1975 additions and 23 deletions

View File

@@ -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'
}

View File

@@ -77,7 +77,6 @@ public class CommonAppConfig {
public static int alert_time = 1;
public static int alert_end_time = 1;
private CommonAppConfig() {
}

View 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;
}
}

View 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;
}
}