diff --git a/common/src/main/java/com/yunbao/common/CommonAppConfig.java b/common/src/main/java/com/yunbao/common/CommonAppConfig.java index 2f447a77e..3ec41c897 100644 --- a/common/src/main/java/com/yunbao/common/CommonAppConfig.java +++ b/common/src/main/java/com/yunbao/common/CommonAppConfig.java @@ -76,6 +76,17 @@ public class CommonAppConfig { public static boolean isGetNewWrap = false;//是否获取到新的包裹礼物 public static int alert_time = 1; public static int alert_end_time = 1; + public static String SWToken = ""; //声网Token + public static final String SWChannelPrefix = "g"; + + + /** + * 获取通道 + * @return + */ + public static String getChannelName() { + return SWChannelPrefix+ getInstance().getUid(); + } private CommonAppConfig() { diff --git a/common/src/main/java/com/yunbao/common/bean/SwTokenModel.java b/common/src/main/java/com/yunbao/common/bean/SwTokenModel.java new file mode 100644 index 000000000..2f50ed67c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/SwTokenModel.java @@ -0,0 +1,23 @@ +package com.yunbao.common.bean; + +/** + * 声网token + */ +public class SwTokenModel extends BaseModel { + private String token; + + public SwTokenModel() { + } + + public SwTokenModel(String token) { + this.token = token; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } +} diff --git a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java index ab4c92838..a2b978554 100644 --- a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java +++ b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java @@ -70,6 +70,7 @@ import com.yunbao.common.bean.StarChallengeStatusModel; import com.yunbao.common.bean.SudGameUserModel; import com.yunbao.common.bean.SudRoomListModel; import com.yunbao.common.bean.SudgameCodeModel; +import com.yunbao.common.bean.SwTokenModel; import com.yunbao.common.bean.UserAreaBean; import com.yunbao.common.bean.UserAvatarSelectBean; import com.yunbao.common.bean.VipModel; @@ -1192,4 +1193,6 @@ public interface PDLiveApi { Observable> checkUpgrades(@Query("liveuid") String liveUid); @GET("/api/public/?service=Guard.getRewards") Observable> guardGetRewards(@Query("guard_level") String guardLevel,@Query("liveuid") String liveUid); + @GET("/api/public/?service=Tx.getShengwangToken") + Observable> getSwToken(); } diff --git a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java index 974ab71af..16d7c046c 100644 --- a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java +++ b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java @@ -66,6 +66,7 @@ import com.yunbao.common.bean.StarChallengeStatusModel; import com.yunbao.common.bean.SudGameUserModel; import com.yunbao.common.bean.SudRoomListModel; import com.yunbao.common.bean.SudgameCodeModel; +import com.yunbao.common.bean.SwTokenModel; import com.yunbao.common.bean.UserAreaBean; import com.yunbao.common.bean.UserAvatarSelectBean; import com.yunbao.common.bean.VipModel; @@ -3133,7 +3134,6 @@ public class LiveNetManager { } } }).isDisposed(); - } public void guardGetRewards(String guardLevel, String liveUid, HttpCallback callback) { @@ -3160,6 +3160,30 @@ public class LiveNetManager { } + public void getSwToken( HttpCallback callback) { + API.get().pdLiveApi(mContext) + .getSwToken() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel listResponseModel) throws Exception { + if (callback != null) { + callback.onSuccess(listResponseModel.getData().getInfo()); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + throwable.printStackTrace(); + if (callback != null) { + callback.onError(mContext.getString(R.string.net_error)); + } + } + }).isDisposed(); + + } + /** * 直播间取消网络请求 */ diff --git a/common/src/main/java/com/yunbao/common/manager/SWAuManager.java b/common/src/main/java/com/yunbao/common/manager/SWAuManager.java index 7a3b9741e..e69707e99 100644 --- a/common/src/main/java/com/yunbao/common/manager/SWAuManager.java +++ b/common/src/main/java/com/yunbao/common/manager/SWAuManager.java @@ -5,15 +5,18 @@ import android.content.Context; import android.view.SurfaceView; import android.widget.FrameLayout; +import com.yunbao.common.CommonAppConfig; import com.yunbao.common.CommonAppContext; import com.yunbao.common.manager.base.BaseCacheManager; +import com.yunbao.common.utils.L; 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.RtcConnection; import io.agora.rtc2.RtcEngineConfig; +import io.agora.rtc2.RtcEngineEx; import io.agora.rtc2.video.VideoCanvas; /** @@ -24,12 +27,9 @@ 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 RtcEngineEx mRtcEngine; private FrameLayout audienceContainer; //主播视图 private FrameLayout pkContainer1; //pk主播视图1 private FrameLayout pkContainer2; //pk主播视图2 @@ -64,7 +64,7 @@ public class SWAuManager extends BaseCacheManager { config.mAppId = SWAuManager.shengwang_appId; config.mEventHandler = mRtcEventHandler; // 创建并初始化 RtcEngine - mRtcEngine = RtcEngine.create(config); + mRtcEngine = (RtcEngineEx) RtcEngineEx.create(config); } catch (Exception e) { throw new RuntimeException("Check the error."); } @@ -76,7 +76,6 @@ public class SWAuManager extends BaseCacheManager { } /** - * guanzhong * 加入房间 */ public void joinRoom(String strUid, String token, String channelName) { @@ -96,11 +95,60 @@ public class SWAuManager extends BaseCacheManager { options.clientRoleType = Constants.CLIENT_ROLE_AUDIENCE; // 直播场景下,设置频道场景为 BROADCASTING (直播场景) options.audienceLatencyLevel = Constants.AUDIENCE_LATENCY_LEVEL_LOW_LATENCY; // 觀眾走極速直播 - // 使用临时 Token 加入频道,自行指定用户 ID 并确保其在频道内的唯一性 mRtcEngine.joinChannel(token, channelName, uid, options); } + + public void joinExRoomEx(String strUid, String token, String channelName) { + int uid; + if (StringUtil.isEmpty(strUid)) { + uid = 0; + } else { + uid = Integer.parseInt(strUid); + } + + // 创建 ChannelMediaOptions 对象,并进行配置 + ChannelMediaOptions options = new ChannelMediaOptions(); + // 根据场景将用户角色设置为 AUDIENCE (观众) + options.clientRoleType = Constants.CLIENT_ROLE_AUDIENCE; + // 直播场景下,设置频道场景为 BROADCASTING (直播场景) + options.audienceLatencyLevel = Constants.AUDIENCE_LATENCY_LEVEL_LOW_LATENCY; // 觀眾走極速直播 + options.autoSubscribeVideo = true; + options.autoSubscribeAudio = true; + + RtcConnection rtcConnection = new RtcConnection(); + rtcConnection.channelId = "g99411"; //對方主播的頻道 + rtcConnection.localUid = 99412;//自己的ID + + mRtcEngine.joinChannelEx(token, rtcConnection, options, new IRtcEngineEventHandler() { + @Override + public void onJoinChannelSuccess(String channel, int uid, int elapsed) { + super.onJoinChannelSuccess(channel, uid, elapsed); + L.eSw("onJoinChannelSuccess:" + channel + " uid " +uid+ " elapsed: " + elapsed); + + SurfaceView surfaceView = new SurfaceView(mContext); + surfaceView.setZOrderMediaOverlay(true); + pkContainer1.addView(surfaceView); + + VideoCanvas videoCanvas = new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_HIDDEN, 99411); + + mRtcEngine.setupRemoteVideoEx(videoCanvas, rtcConnection); + + } + + @Override + public void onError(int err) { + super.onError(err); + L.eSw("onError:" + err); + } + }); + } + + public static String getChannelName(String liveUid) { + return CommonAppConfig.SWChannelPrefix + liveUid; + } + //远程监听 private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() { @Override @@ -110,7 +158,7 @@ public class SWAuManager extends BaseCacheManager { @Override public void run() { // 获取 uid 后,设置远端视频视图 - setupRemoteVideo(uid); + //setupRemoteVideo(uid); } }); } diff --git a/common/src/main/java/com/yunbao/common/manager/SWManager.java b/common/src/main/java/com/yunbao/common/manager/SWManager.java index a97d85b9b..5dfeaf474 100644 --- a/common/src/main/java/com/yunbao/common/manager/SWManager.java +++ b/common/src/main/java/com/yunbao/common/manager/SWManager.java @@ -5,17 +5,23 @@ import android.content.Context; import android.view.SurfaceView; import android.widget.FrameLayout; +import com.yunbao.common.CommonAppConfig; import com.yunbao.common.CommonAppContext; +import com.yunbao.common.bean.SwTokenModel; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.manager.base.BaseCacheManager; +import com.yunbao.common.utils.L; 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.RtcConnection; import io.agora.rtc2.RtcEngine; import io.agora.rtc2.RtcEngineConfig; +import io.agora.rtc2.RtcEngineEx; import io.agora.rtc2.video.VideoCanvas; import io.agora.rtc2.video.VideoEncoderConfiguration; @@ -27,12 +33,9 @@ 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 RtcEngineEx mRtcEngine; private int uid; VideoEncoderConfiguration cfg; private FrameLayout anchorContainer; //主播视图 @@ -79,7 +82,7 @@ public class SWManager extends BaseCacheManager { config.mAppId = SWManager.shengwang_appId; config.mEventHandler = mRtcEventHandler; // 创建并初始化 RtcEngine - mRtcEngine = RtcEngine.create(config); + mRtcEngine = (RtcEngineEx) RtcEngineEx.create(config); } catch (Exception e) { throw new RuntimeException("Check the error."); } @@ -131,7 +134,6 @@ public class SWManager extends BaseCacheManager { } } - /** * 创建房间 */ @@ -143,6 +145,68 @@ public class SWManager extends BaseCacheManager { mRtcEngine.joinChannel(token, channelName, uid, options); } + public void updateMyVideoView(FrameLayout frameLayout, String channelName) { + mRtcEngine.setupRemoteVideoEx(null, null); + + RtcConnection rtcConnection = new RtcConnection(); + rtcConnection.channelId = channelName; //自己频道名称 + rtcConnection.localUid = uid;//自己的ID + + SurfaceView surfaceView = new SurfaceView(mContext); + surfaceView.setZOrderMediaOverlay(true); + frameLayout.addView(surfaceView); + + VideoCanvas videoCanvas = new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_HIDDEN, uid); + mRtcEngine.setupRemoteVideoEx(videoCanvas, rtcConnection); + } + + + public void joinExRoomEx(String strUid, String token,String toUid, String channelName) { + int tempUid; + if (StringUtil.isEmpty(strUid)) { + tempUid = 0; + } else { + tempUid = Integer.parseInt(strUid); + } + + // 创建 ChannelMediaOptions 对象,并进行配置 + ChannelMediaOptions options = new ChannelMediaOptions(); + // 根据场景将用户角色设置为 AUDIENCE (观众) + options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER; + options.autoSubscribeVideo = true; + options.autoSubscribeAudio = true; + options.publishMicrophoneTrack = false; + options.publishCameraTrack = false; + + RtcConnection rtcConnection = new RtcConnection(); + rtcConnection.channelId = channelName; //對方主播的頻道 + rtcConnection.localUid = tempUid;//自己的ID + L.eSw("strUid:" + tempUid + "_token:" + token + "_channelName:" + channelName); + mRtcEngine.joinChannelEx(token, rtcConnection, options, new IRtcEngineEventHandler() { + @Override + public void onJoinChannelSuccess(String channel, int scUid, int elapsed) { + super.onJoinChannelSuccess(channel, scUid, elapsed); + L.eSw("onJoinChannelSuccess:" + channel + " uid " + scUid + " elapsed: " + elapsed); + mContext.runOnUiThread(new Runnable() { + @Override + public void run() { + SurfaceView surfaceView = new SurfaceView(mContext); + surfaceView.setZOrderMediaOverlay(true); + pkContainer1.addView(surfaceView); + VideoCanvas videoCanvas = new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT,Integer.parseInt(toUid)); + mRtcEngine.setupRemoteVideoEx(videoCanvas, rtcConnection); + } + }); + } + + @Override + public void onError(int err) { + super.onError(err); + L.eSw("onError:" + err); + } + }); + } + //远程监听 private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() { @Override @@ -152,7 +216,7 @@ public class SWManager extends BaseCacheManager { @Override public void run() { // 获取 uid 后,设置远端视频视图 - setupRemoteVideo(uid); + //setupRemoteVideo(uid); } }); } @@ -170,8 +234,36 @@ public class SWManager extends BaseCacheManager { super.onError(err); ToastUtil.show("onError:" + err); } + + @Override + public void onTokenPrivilegeWillExpire(String token) { + super.onTokenPrivilegeWillExpire(token); + refreshToken(); + } + + @Override + public void onRequestToken() { + super.onRequestToken(); + refreshToken(); + } }; + private void refreshToken() { + LiveNetManager.get(mContext).getSwToken(new HttpCallback() { + @Override + public void onSuccess(SwTokenModel data) { + if (mRtcEngine != null) { + mRtcEngine.renewToken(data.getToken()); + } + } + + @Override + public void onError(String error) { + + } + }); + } + //设置对方主播视图 private void setupRemoteVideo(int uid) { SurfaceView surfaceView = new SurfaceView(mContext); diff --git a/common/src/main/java/com/yunbao/common/utils/L.java b/common/src/main/java/com/yunbao/common/utils/L.java index 990473aed..7d4a2dc93 100644 --- a/common/src/main/java/com/yunbao/common/utils/L.java +++ b/common/src/main/java/com/yunbao/common/utils/L.java @@ -12,10 +12,18 @@ public class L { private final static String TAG = "log--->"; + private final static String TAG_SW = "log--->TAG_SW"; + public static void e(String s) { e(TAG, s); } + public static void eSw(String s) { + if (sDeBug) { + Log.e(TAG_SW, s); + } + } + public static void e(String tag, String s) { if (sDeBug) { Log.e(tag, s); diff --git a/live/src/main/AndroidManifest.xml b/live/src/main/AndroidManifest.xml index 6c664cb33..1af89a691 100644 --- a/live/src/main/AndroidManifest.xml +++ b/live/src/main/AndroidManifest.xml @@ -124,10 +124,6 @@ - - \ No newline at end of file diff --git a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java index d1ed67746..7b1526ba1 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -3,6 +3,7 @@ package com.yunbao.live.activity; import static com.blankj.utilcode.util.SnackbarUtils.dismiss; import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_DISABLE; import static com.tencent.trtc.TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_ENABLE; +import static com.yunbao.common.Constants.SOCKET_LINK_MIC_PK; import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK; import static com.yunbao.common.Constants.SOCKET_LIVE_DRPK_RANDOM; import static com.yunbao.live.views.LiveRyAnchorViewHolder.btn_dr_pk_nub; @@ -101,6 +102,7 @@ import com.yunbao.live.interfaces.LiveFunctionClickListener; import com.yunbao.live.interfaces.LivePushListener; import com.yunbao.live.music.LiveMusicDialogFragment; import com.yunbao.live.presenter.LiveLinkMicAnchorPresenter; +import com.yunbao.live.presenter.LiveLinkMicPkPresenter; import com.yunbao.live.presenter.LiveLinkMicPresenter; import com.yunbao.live.presenter.LiveRyLinkMicPkPresenter; import com.yunbao.live.socket.SocketRyChatUtil; @@ -1235,8 +1237,40 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl if (obj != null) { if (obj.getString("ispk").equals("0")) { + // TODO: 2024/4/11 发送IM消息 + final SocketSendBean msg1 = new SocketSendBean() + .param("_method_", SOCKET_LINK_MIC_PK) + .param("action", 1) + .param("uname", CommonAppConfig.getInstance().getUserBean().getUserNiceName()) + .param("pkuid", pkUid) + .param("uid", CommonAppConfig.getInstance().getUid()) + .param("pkhead", CommonAppConfig.getInstance().getUserBean().getAvatar()) + .param("pkname", CommonAppConfig.getInstance().getUserBean().getUserNiceName()); + msg1.create(); - IMRTCManager.getInstance().requestJoinOtherRoom(pkUid, true, extra, new IRCRTCResultCallback() { + Conversation.ConversationType conversationType = Conversation.ConversationType.CHATROOM; + TextMessage messageContent = TextMessage.obtain(msg1.mResult.toString()); + io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain("g" + pkUid, conversationType, messageContent); + + RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() { + @Override + public void onAttached(io.rong.imlib.model.Message message) { + + } + + @Override + public void onSuccess(io.rong.imlib.model.Message message) { + Log.e("tx", "发送成功"); + } + + @Override + public void onError(io.rong.imlib.model.Message message, RongIMClient.ErrorCode errorCode) { + Log.e("tx", "发送失败" + errorCode.getMessage()); + + } + }); + + /*IMRTCManager.getInstance().requestJoinOtherRoom(pkUid, true, extra, new IRCRTCResultCallback() { @Override public void onSuccess() { // ToastUtil.show("邀请 " + pkUid + " 发送成功"); @@ -1264,7 +1298,8 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl ToastUtil.show("invite " + pkUid + " failed:" + rtcErrorCode); } } - }); + });*/ + } else { ToastUtil.show("主播正在PK,稍後再試"); diff --git a/live/src/main/java/com/yunbao/live/activity/NewLiveActivity.java b/live/src/main/java/com/yunbao/live/activity/NewLiveActivity.java deleted file mode 100644 index 6dfb2bbf5..000000000 --- a/live/src/main/java/com/yunbao/live/activity/NewLiveActivity.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.yunbao.live.activity; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - -import android.Manifest; -import android.content.pm.PackageManager; -import android.view.SurfaceView; -import android.widget.FrameLayout; - -import android.os.Bundle; - -import com.yunbao.common.manager.SWManager; -import com.yunbao.live.R; - -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 NewLiveActivity extends AppCompatActivity { - private RtcEngine mRtcEngine; - - private final IRtcEngineEventHandler mRtcEventHandler = new IRtcEngineEventHandler() { - @Override - // 监听频道内的远端用户,获取用户的 uid 信息 - public void onUserJoined(int uid, int elapsed) { - runOnUiThread(new Runnable() { - @Override - public void run() { - // 获取 uid 后,设置远端视频视图 - setupRemoteVideo(uid); - } - }); - } - }; - - private void initializeAndJoinChannel() { - try { - // 创建 RtcEngineConfig 对象,并进行配置 - RtcEngineConfig config = new RtcEngineConfig(); - config.mContext = getBaseContext(); - config.mAppId = SWManager.shengwang_appId; - config.mEventHandler = mRtcEventHandler; - // 创建并初始化 RtcEngine - mRtcEngine = RtcEngine.create(config); - } catch (Exception e) { - throw new RuntimeException("Check the error."); - } - // 启用视频模块 - mRtcEngine.enableVideo(); - // 开启本地预览 - mRtcEngine.startPreview(); - - // 创建一个 SurfaceView 对象,并将其作为 FrameLayout 的子对象 - FrameLayout container = findViewById(R.id.local_video_view_container); - SurfaceView surfaceView = new SurfaceView(getBaseContext()); - container.addView(surfaceView); - // 将 SurfaceView 对象传入声网实时互动 SDK,设置本地视图 - mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, 0)); - - // 创建 ChannelMediaOptions 对象,并进行配置 - ChannelMediaOptions options = new ChannelMediaOptions(); - // 根据场景将用户角色设置为 BROADCASTER (主播) 或 AUDIENCE (观众) - options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER; - // 直播场景下,设置频道场景为 BROADCASTING (直播场景) - options.channelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING; - - // 使用临时 Token 加入频道,自行指定用户 ID 并确保其在频道内的唯一性 - mRtcEngine.joinChannel(SWManager.shengwang_token, SWManager.shengwang_channelName, 0, options); - } - - private void setupRemoteVideo(int uid) { - FrameLayout container = findViewById(R.id.remote_video_view_container); - SurfaceView surfaceView = new SurfaceView(getBaseContext()); - surfaceView.setZOrderMediaOverlay(true); - container.addView(surfaceView); - // 将 SurfaceView 对象传入声网实时互动 SDK,设置远端视图 - mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, uid)); - } - - private static final int PERMISSION_REQ_ID = 22; - - // 获取体验实时音视频互动所需的录音、摄像头等权限 - private String[] getRequiredPermissions() { - // 判断 targetSDKVersion 31 及以上时所需的权限 - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { - return new String[]{ - Manifest.permission.RECORD_AUDIO, // 录音权限 - Manifest.permission.CAMERA, // 摄像头权限 - Manifest.permission.READ_PHONE_STATE, // 读取电话状态权限 - Manifest.permission.BLUETOOTH_CONNECT // 蓝牙连接权限 - }; - } else { - return new String[]{ - Manifest.permission.RECORD_AUDIO, - Manifest.permission.CAMERA - }; - } - } - - private boolean checkPermissions() { - for (String permission : getRequiredPermissions()) { - int permissionCheck = ContextCompat.checkSelfPermission(this, permission); - if (permissionCheck != PackageManager.PERMISSION_GRANTED) { - return false; - } - } - return true; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.acticity_new_live); - // 如果已经授权,则初始化 RtcEngine 并加入频道 - initializeAndJoinChannel(); - if (checkPermissions()) { - initializeAndJoinChannel(); - } else { - ActivityCompat.requestPermissions(this, getRequiredPermissions(), PERMISSION_REQ_ID); - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - - // 停止本地视频预览 - mRtcEngine.stopPreview(); - - // 离开频道 - mRtcEngine.leaveChannel(); - } -} diff --git a/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java b/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java index 60325da49..44abb11f6 100644 --- a/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java +++ b/live/src/main/java/com/yunbao/live/presenter/LiveRyLinkMicPkPresenter.java @@ -52,6 +52,7 @@ import com.yunbao.common.manager.RandomPkManager; import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.DpUtil; +import com.yunbao.common.utils.L; import com.yunbao.common.utils.ScreenDimenUtil; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; @@ -683,9 +684,9 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { public void onLinkMicToPk(UserBean u) { EventBus.getDefault().post(new AnchorInfoEvent(false, u.getId(), u.getUserNiceName(), u.getAvatar())); Log.e("eve", u.getId() + ""); + L.eSw("主播接受了主播的PK邀請"); /** * 加入副房间 - * * 前提必须已经 通过 {@link RCRTCEngine#joinRoom(String, RCRTCRoomType, IRCRTCResultDataCallback)} 或 {@link RCRTCEngine#joinRoom(String, IRCRTCResultDataCallback)} 加入了主房间 * * @param roomId 房间 ID ,长度 64 个字符,可包含:`A-Z`、`a-z`、`0-9`、`+`、`=`、`-`、`_` @@ -693,7 +694,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { * @group 房间管理 */ RandomPkManager.getInstance().setPkStatus(RandomPkManager.PK_STATUS_START); - RCRTCEngine.getInstance().joinOtherRoom(u.getId(), new IRCRTCResultDataCallback() { + /*RCRTCEngine.getInstance().joinOtherRoom(u.getId(), new IRCRTCResultDataCallback() { @Override public void onSuccess(RCRTCOtherRoom rcrtcOtherRoom) { rcrtcOtherRoom.registerOtherRoomEventsListener(otherRoomEventsListener); @@ -779,17 +780,18 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { public void onFailed(RTCErrorCode rtcErrorCode) { Log.i("ry", "11111加入其他房间失败 :" + rtcErrorCode.getReason()); } - }); + });*/ LivePushRyViewHolder.btn_close.setVisibility(View.VISIBLE); LiveRyAnchorActivity.isDRPK = 1; ScreenDimenUtil util = ScreenDimenUtil.getInstance(); int mScreenWdith = util.getScreenWdith(); - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960); + /*LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mScreenWdith * 720 / 960); params.weight = 1; params.topMargin = mContext.getResources().getDimensionPixelOffset(R.dimen.live_top); livePushRyViewHolder.camera.setLayoutParams(params); livePushRyViewHolder.mPreView1.setLayoutParams(params); - livePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE); + livePushRyViewHolder.mPreView1.setVisibility(View.VISIBLE);*/ + livePushRyViewHolder.setAnPkRtc(u);//设置对方主播视图 final SocketSendBean msg1 = new SocketSendBean() .param("_method_", SOCKET_LINK_MIC_PK) @@ -801,7 +803,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { .param("pkname", u.getUserNiceName()); msg1.create(); - Conversation.ConversationType conversationType = Conversation.ConversationType.CHATROOM; + /*Conversation.ConversationType conversationType = Conversation.ConversationType.CHATROOM; TextMessage messageContent = TextMessage.obtain(msg1.mResult.toString()); io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain("g" + CommonAppConfig.getInstance().getUid(), conversationType, messageContent); @@ -821,7 +823,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { Log.e("tx", "发送失败" + errorCode.getMessage()); } - }); + });*/ } @@ -837,7 +839,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { LivePushRyViewHolder.btn_close.setVisibility(View.VISIBLE); LiveRyAnchorActivity.isDRPK = 1; - JSONObject msg1 = new JSONObject(); + /*JSONObject msg1 = new JSONObject(); msg1.put("uid", CommonAppConfig.getInstance().getUid()); msg1.put("pkuid", CommonAppConfig.getInstance().getUid()); msg1.put("pkhead", CommonAppConfig.getInstance().getUserBean().getAvatarThumb()); @@ -847,9 +849,47 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { if (bean != null && bean.isRandomPk()) { msg1.put("random_pk", bean.isRandomPk() ? 1 : 0); msg1.put("is_ladders", bean.getRankPkImgUrl()); - } + }*/ + + + /*---------------------------------------------------------------- */ + final SocketSendBean msg1 = new SocketSendBean() + .param("_method_", SOCKET_LINK_MIC_PK) + .param("action", 2) //回复PK申请 2 + .param("uname", CommonAppConfig.getInstance().getUserBean().getUserNiceName()) + .param("pkuid", CommonAppConfig.getInstance().getUid()) + .param("uid", CommonAppConfig.getInstance().getUid()) + .param("pkhead", CommonAppConfig.getInstance().getUserBean().getAvatar()) + .param("pkname", CommonAppConfig.getInstance().getUserBean().getUserNiceName()); + msg1.create(); System.out.println("PK回执 = " + msg1.toString()); - IMRTCManager.getInstance().responseJoinOtherRoom(mApplyUid, true, msg1.toString(), new IRCRTCResultCallback() { + Conversation.ConversationType conversationType = Conversation.ConversationType.CHATROOM; + TextMessage messageContent = TextMessage.obtain(msg1.mResult.toString()); + io.rong.imlib.model.Message message = io.rong.imlib.model.Message.obtain("g" + bean.getId(), conversationType, messageContent); + + RongIMClient.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() { + @Override + public void onAttached(io.rong.imlib.model.Message message) { + + } + + @Override + public void onSuccess(io.rong.imlib.model.Message message) { + Log.e("tx", "发送成功"); + } + + @Override + public void onError(io.rong.imlib.model.Message message, RongIMClient.ErrorCode errorCode) { + Log.e("tx", "发送失败" + errorCode.getMessage()); + + } + }); + + // TODO: 2024/4/12 视图渲染 + livePushRyViewHolder.setAnPkRtc(bean); + + + /*IMRTCManager.getInstance().responseJoinOtherRoom(mApplyUid, true, msg1.toString(), new IRCRTCResultCallback() { @Override public void onSuccess() { RCRTCEngine.getInstance().joinOtherRoom(mApplyUid, new IRCRTCResultDataCallback() { @@ -956,7 +996,7 @@ public class LiveRyLinkMicPkPresenter implements View.OnClickListener { public void onFailed(RTCErrorCode errorCode) { ToastUtil.show("接受失败"); } - }); + });*/ } diff --git a/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java b/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java index 549c32778..780f934e2 100644 --- a/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java +++ b/live/src/main/java/com/yunbao/live/socket/SocketRyClient.java @@ -1374,7 +1374,7 @@ public class SocketRyClient { private void processAnchorLinkMicPk(JSONObject map) { int action = map.getIntValue("action"); Log.i("Socket", "action = " + action + " json = " + map.toString()); - + L.eSw("处理主播与主播PK逻辑action = " + action + " json = " + map.toString()); switch (action) { case 1://收到对方主播PK回调 UserBean u = new UserBean(); diff --git a/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java b/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java index 2b1c7e4f2..ca097bcf6 100644 --- a/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/AbsRyLivePushViewHolder.java @@ -11,6 +11,8 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.fragment.app.Fragment; + import com.yunbao.common.CommonAppConfig; import com.yunbao.common.utils.L; import com.yunbao.common.views.AbsViewHolder; @@ -30,7 +32,7 @@ public class AbsRyLivePushViewHolder extends AbsViewHolder implements ILivePushV protected ViewGroup mBigContainer; protected ViewGroup mSmallContainer; protected ViewGroup mLeftContainer; - protected ViewGroup mRightContainer; + protected FrameLayout mRightContainer; protected ViewGroup mPkContainer; public FrameLayout mPreView, mPreView1, cameraPreview3, dr1_preview, dr2_preview, dr3_preview, dr4_preview; public ImageView leave; @@ -59,7 +61,7 @@ public class AbsRyLivePushViewHolder extends AbsViewHolder implements ILivePushV mBigContainer = (ViewGroup) findViewById(R.id.big_container); mSmallContainer = (ViewGroup) findViewById(R.id.small_container); mLeftContainer = (ViewGroup) findViewById(R.id.left_container); - mRightContainer = (ViewGroup) findViewById(R.id.right_container); + mRightContainer = (FrameLayout) findViewById(R.id.right_container); mPkContainer = (ViewGroup) findViewById(R.id.pk_container); mCameraFront = true; String mBeautySdkType = CommonAppConfig.getInstance().getBeautySdkType(); diff --git a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java index 5863c3b91..dcca21861 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java @@ -308,7 +308,6 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } private void setSelectClarity(int selectClarity) { - this.selectClarity = selectClarity; IMLoginManager.get(mContext).setSelectClarity(selectClarity); switch (selectClarity) { @@ -330,7 +329,6 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } SWManager.get().setDimensions(selectClarity); - /*//設置開播分辨率 RCRTCParamsType.RCRTCVideoResolution rcrtcVideoResolution = RCRTCParamsType.RCRTCVideoResolution.RESOLUTION_480_848; int minRate = 200; diff --git a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java index 5c4b48ab3..204f15b59 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlayRyViewHolder.java @@ -31,6 +31,7 @@ import com.lxj.xpopup.core.BasePopupView; import com.lxj.xpopup.interfaces.XPopupCallback; import com.lzf.easyfloat.EasyFloat; import com.lzy.okserver.OkDownload; +import com.yunbao.common.CommonAppConfig; import com.yunbao.common.bean.EnterRoomNewModel; import com.yunbao.common.dialog.LiveFontSizeSettingDialog; import com.yunbao.common.http.HttpCallback; @@ -100,6 +101,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { public StyledPlayerView mVideoView; private FrameLayout playFrameLayout; + private FrameLayout playFrameLayout1; private View mLoading, mLoading2; private ImageView mCover; @@ -127,6 +129,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { RCRTCRoom rcrtcRoom; String purl, srcUrl; SWAuManager swAuManager; + String liveUid; public int getLandscape() { return landscape; @@ -137,9 +140,9 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { contexts = context; landscape = landscapes; Log.i("收收收", landscape + ""); + L.eSw("liveUid:" + liveUid); } - @Override protected int getLayoutId() { return R.layout.view_live_play_ksy; @@ -152,6 +155,7 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { Bus.getOn(this); mRoot = (ViewGroup) findViewById(R.id.root); playFrameLayout = (FrameLayout) findViewById(R.id.playView); + playFrameLayout1 = (FrameLayout) findViewById(R.id.playView1); mSmallContainer = (ViewGroup) findViewById(R.id.small_container); mLeftContainer = (ViewGroup) findViewById(R.id.left_container); mRightContainer = (ViewGroup) findViewById(R.id.right_container); @@ -174,15 +178,21 @@ public class LivePlayRyViewHolder extends LiveRoomPlayViewHolder { mPlayer.setMainView(mVideoView); mPlayer.setListener(new ExoPlayerListener()); + debugView = new TextView(mContext); + debugView.setBackgroundColor(Color.WHITE); + } + + public void initSwEngine(String liveUid) { + this.liveUid = liveUid; swAuManager = SWAuManager.get(); swAuManager.setAudienceContainer(playFrameLayout); swAuManager.initRtcEngine((Activity) mContext); - swAuManager.setupRemoteVideo(11); - swAuManager.joinRoom("9999", SWAuManager.shengwang_token, SWAuManager.shengwang_channelName); - - debugView = new TextView(mContext); - debugView.setBackgroundColor(Color.WHITE); + swAuManager.setupRemoteVideo(Integer.parseInt(liveUid)); + swAuManager.joinRoom(CommonAppConfig.getInstance().getUid(), CommonAppConfig.SWToken, SWAuManager.getChannelName(liveUid)); + //测试-模拟PK场景,加入第二个主播视图 + swAuManager.setPkContainer1(playFrameLayout1); + swAuManager.joinExRoomEx(CommonAppConfig.getInstance().getUid(), CommonAppConfig.SWToken, SWAuManager.getChannelName(liveUid)); } @Override diff --git a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java index 0e7d75410..aeb0a5f8c 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePushRyViewHolder.java @@ -46,6 +46,7 @@ import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.IMRTCManager; import com.yunbao.common.manager.RandomPkManager; +import com.yunbao.common.manager.SWAuManager; import com.yunbao.common.manager.SWManager; import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DialogUitl; @@ -503,7 +504,6 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX } }); - HttpClient.getInstance().get("Livepk.endPK", "Livepk.endPK") .params("uid", CommonAppConfig.getInstance().getUid()) .params("addtime", "1") @@ -772,23 +772,36 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX */ private void initRtcEngine() { swManager = SWManager.get(); - swManager.setAnchorContainer(mPreView); - swManager.initRtcEngine((Activity) mContext, "11"); + swManager.setAnchorContainer((FrameLayout) mLeftContainer); + swManager.initRtcEngine((Activity) mContext, CommonAppConfig.getInstance().getUid()); swManager.setOnRtcEngineListener(new SWManager.onRtcEngineListener() { @Override public void onOpenSuccess(String channel, int uid) { //开播成功 - + L.eSw("开播成功"); } }); } + public void setAnPkRtc(UserBean u) { + if (swManager != null && u != null) { + L.eSw("设置对方主播的视图setAnPkRtc" + u); + + //将自己的渲染视图设置到 leftContainer + //swManager.updateMyVideoView((FrameLayout) mLeftContainer,SWAuManager.getChannelName(CommonAppConfig.getInstance().getUid())); + + //设置对方主播的渲染视图 设置到 rightContainer + swManager.setPkContainer1(mRightContainer); + swManager.joinExRoomEx(CommonAppConfig.getInstance().getUid(), CommonAppConfig.SWToken,u.getId(), SWAuManager.getChannelName(u.getId())); + } + } + @Override public void changeToLeft() { if (mPreView != null) { - FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mPreView.getLayoutParams(); + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mPreView.getLayoutParams(); params.width = mPreView.getWidth() / 2; - params.height = DpUtil.dp2px(250); + params.height = DpUtil.dp2px(mPreView.getHeight()); params.topMargin = DpUtil.dp2px(130); camera.setLayoutParams(params); } @@ -844,7 +857,6 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX ToastUtil.show(mContext.getString(R.string.live_open_flash)); return; } - } /** @@ -856,7 +868,7 @@ public class LivePushRyViewHolder extends AbsRyLivePushViewHolder implements ITX public void startPush(String pushUrl) { //开播成功,创建频道 if (swManager != null) { - swManager.createRoom(SWManager.shengwang_token, SWManager.shengwang_channelName); + swManager.createRoom(CommonAppConfig.SWToken, CommonAppConfig.getChannelName()); } if (rcrtcLiveInfo != null) { rcrtcLiveInfo.addPublishStreamUrl(pushUrl, new IRCRTCResultDataCallback() { diff --git a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java index 801bab514..9554d80c4 100644 --- a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java +++ b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java @@ -365,6 +365,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe liveHandler.removeCallbacks(loadTimeoutRunnableGone); if (mLivePlayViewHolder == null) { mLivePlayViewHolder = new LivePlayRyViewHolder(mContext, playContainer, 1); + mLivePlayViewHolder.initSwEngine(mLiveBean.getUid()); mLiveRoomViewHolder = new LiveRoomViewHolder(false, 1, mContext, mContainer, mSecondPage.findViewById(R.id.gift_gif), mSecondPage.findViewById(R.id.gift_svga), mContainerWrap, mContext.getWindowManager()); mLiveAudienceViewHolder = new LiveAudienceViewHolder(mContext, mContainer); mLiveLinkMicPresenter = new LiveLinkMicPresenter(mContext, mLivePlayViewHolder, false, mLiveSDK, mLiveAudienceViewHolder.getContentView()); diff --git a/live/src/main/res/layout/acticity_new_live.xml b/live/src/main/res/layout/acticity_new_live.xml deleted file mode 100644 index 886d43dcd..000000000 --- a/live/src/main/res/layout/acticity_new_live.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - diff --git a/live/src/main/res/layout/view_live_play_ksy.xml b/live/src/main/res/layout/view_live_play_ksy.xml index b602c6757..4eea26aeb 100644 --- a/live/src/main/res/layout/view_live_play_ksy.xml +++ b/live/src/main/res/layout/view_live_play_ksy.xml @@ -2,23 +2,39 @@ + android:layout_height="match_parent" + android:animateLayoutChanges="true"> + app:surface_type="texture_view" + app:use_controller="false" /> - + android:layout_height="300dp" + android:layout_centerVertical="true" + android:orientation="horizontal"> + + + + + + + + - - - @@ -195,7 +195,6 @@ android:textSize="13sp" android:visibility="gone" /> - - () { + @Override + public void onSuccess(SwTokenModel data) { + CommonAppConfig.SWToken = data.getToken(); + } + + @Override + public void onError(String error) { + + } + }); } /** @@ -798,18 +817,17 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene private void showStartDialog() { - if (isReady == true) { - MainStartDialogFragment dialogFragment = new MainStartDialogFragment(); - dialogFragment.setMainStartChooseCallback(true, this); - dialogFragment.show(getSupportFragmentManager(), "MainStartDialogFragment"); - } else { - ToastUtil.show("正在初始化,請稍等...."); - } + if (isReady == true) { + MainStartDialogFragment dialogFragment = new MainStartDialogFragment(); + dialogFragment.setMainStartChooseCallback(true, this); + dialogFragment.show(getSupportFragmentManager(), "MainStartDialogFragment"); + } else { + ToastUtil.show("正在初始化,請稍等...."); + } } - /** * 检查版本更新 */