保利威文档中心

幫助中心

3_4-云课堂场景-连麦

更新時間:2023-04-17 15:27:57

1 功能概述

保利威雲課堂 SDK 支援連麥功能,可自由選擇舉手連麥、音訊連麥、視訊連麥,並支援多人連麥,豐富課堂內容。

連麥流程:講師端發起連麥 -> 學員舉手申請連麥 -> 講師端允許學員連麥 -> 學員正式加入連麥。

2 使用演示

//初始化
ViewStub linkmicLayoutViewStub = findViewById(R.id.plvlc_linkmic_layout);
IPLVLCLinkMicLayout linkMicLayout = (IPLVLCLinkMicLayout) linkmicLayoutViewStub.inflate();
linkMicLayout.init(liveRoomDataManager, linkMicControlBar);
linkMicLayout.hideAll();
//设置连麦布局监听器
linkMicLayout.setOnPLVLinkMicLayoutListener();

詳細的呼叫程式碼以及與其他模組的通訊,請參考 PLVLCCloudClassActivity 類別中的程式碼呼叫。

3 接口介紹

3.1 IPLVLCLinkMicControlBar

雲課堂場景下,針對連麥控制條佈局進行封裝的 Interface,在 [PLVLinkMicLayout] 中被使用,用於將最新的連麥狀態更新到控制條。 定義了:

  1. 外部直接呼叫的方法
  2. 需要外部回應的事件監聽器
public interface IPLVLCLinkMicControlBar {

    // <editor-fold defaultstate="collapsed" desc="1. 外部直接调用的方法">

    /**
     * 设置监听器
     *
     * @param onPLCLinkMicControlBarListener listener
     */
    void setOnPLCLinkMicControlBarListener(OnPLCLinkMicControlBarListener onPLCLinkMicControlBarListener);

    /**
     * 设置讲师开启或关闭连麦
     *
     * @param isTeacherOpenLinkMic true表示讲师开启连麦
     */
    void setIsTeacherOpenLinkMic(boolean isTeacherOpenLinkMic);

    /**
     * 设置开关摄像头
     *
     * @param toOpen true表示要打开摄像头
     */
    void setCameraOpenOrClose(boolean toOpen);

    /**
     * 开关麦克风
     *
     * @param toOpen true表示要打开麦克风
     */
    void setMicrophoneOpenOrClose(boolean toOpen);


    /**
     * 设置上麦成功
     */
    void setJoinLinkMicSuccess();

    /**
     * 设置离开连麦
     */
    void setLeaveLinkMic();


    /**
     * 设置是音频连麦还是视频连麦
     *
     * @param isAudio true表示是音频连麦,false表示是视频连麦
     */
    void setIsAudio(boolean isAudio);

    /**
     * 显示
     */
    void show();

    /**
     * 隐藏
     */
    void hide();
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="2. 需要外部响应的事件监听器">
    interface OnPLCLinkMicControlBarListener {
        /**
         * 点击请求上麦
         */
        void onClickRingUpLinkMic();

        /**
         * 点击下麦
         */
        void onClickRingOffLinkMic();

        /**
         * 点击开关摄像头
         *
         * @param toClose true表示关闭。false表示开启
         */
        void onClickCameraOpenOrClose(boolean toClose);

        /**
         * 点击前后置摄像头
         *
         * @param toFront true表示前置,false表示后置
         */
        void onClickCameraFrontOfBack(boolean toFront);

        /**
         * 点击开关麦克风
         *
         * @param toClose true表示关闭。false表示开启
         */
        void onClickMicroPhoneOpenOrClose(boolean toClose);

    }
    // </editor-fold>

}

3.2 IPLVLCLinkMicLayout

雲課堂場景下,針對連麥佈局進行封裝的 Interface。 定義了:

  1. 雲課堂使用的連麥佈局接口
  2. 需要外部回應的事件監聽器
public interface IPLVLCLinkMicLayout {

    
    // <editor-fold defaultstate="collapsed" desc="1. 外部直接调用的方法">

    /**
     * 初始化,设置数据
     *
     * @param liveRoomDataManager 频道数据
     */
    void init(IPLVLiveRoomDataManager liveRoomDataManager, IPLVLCLinkMicControlBar linkMicControlBar);

    /**
     * 销毁
     */
    void destroy();

    /**
     * 显示
     */
    void showAll();

    /**
     * 隐藏
     */
    void hideAll();

    /**
     * 隐藏连麦列表
     */
    void hideLinkMicList();

    /**
     * 显示连麦列表
     */
    void showLinkMicList();

    /**
     * 隐藏连麦控制条
     */
    void hideControlBar();

    /**
     * 显示连麦控制条
     */
    void showControlBar();

    /**
     * 设置是否讲师打开连麦
     *
     * @param isTeacherOpenLinkMic 讲师是否打开连麦
     */
    void setIsTeacherOpenLinkMic(boolean isTeacherOpenLinkMic);

    /**
     * 设置连麦类型
     *
     * @param isAudioLinkMic true表示是音频连麦,false表示是视频连麦
     */
    void setIsAudio(boolean isAudioLinkMic);

    /**
     * 是否已经加入连麦
     *
     * @return true表示已经加入了连麦,false表示没有加入连麦
     */
    boolean isJoinLinkMic();

    /**
     * Media是否被切换到连麦列表了
     *
     * @return true表示media在连麦列表,false表示media不在连麦列表
     */
    boolean isMediaShowInLinkMicList();

    /**
     * 设置连麦布局监听器
     *
     * @param onPLVLinkMicLayoutListener 连麦布局监听器
     */
    void setOnPLVLinkMicLayoutListener(OnPLVLinkMicLayoutListener onPLVLinkMicLayoutListener);

    /**
     * 获取横屏时连麦布局的宽度
     *
     * @return 横屏宽
     */
    int getLandscapeWidth();
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="2. 需要外部响应的事件监听器">

    /**
     * 连麦布局监听器
     */
    interface OnPLVLinkMicLayoutListener {
        //todo 未来将支持画笔事件

        // <editor-fold defaultstate="collapsed" desc="画笔事件监听">
        //        //点击擦除PPT画笔
        //        void onUpdateEraseStatus(boolean toErase);
        //
        //        //更新画笔颜色
        //        void onUpdateBrushColor(String color);
        //
        //        //更新画笔状态
        //        boolean onUpdateBrushStatus(boolean unSelected);
        //        // </editor-fold>

        // <editor-fold defaultstate="collapsed" desc="连麦事件监听">

        /**
         * 加入连麦成功
         */
        void onJoinChannelSuccess();

        /**
         * 离开连麦
         */
        void onLeaveChannel();
        // </editor-fold>

        // <editor-fold defaultstate="collapsed" desc="点击事件监听器">

        /**
         * 切换连麦连麦中讲师的位置,因为纯视频的频道连麦时,讲师默认在主屏
         *
         * @param viewSwitcher switchView的切换器
         * @param switchView   讲师连麦Item的switch view
         */
        void onChangeTeacherLocation(PLVViewSwitcher viewSwitcher, PLVSwitchViewAnchorLayout switchView);

        /**
         * 点击连麦Item与media切换,只切换一次。
         * 当点击连麦列表item时,media在主屏幕,或刚好点击的item就是media,那么此时只发生一次切换,即media和连麦Item切换。
         *
         * @param switchView 连麦Item的switch view
         */
        void onClickSwitchWithMediaOnce(PLVSwitchViewAnchorLayout switchView);

        /**
         * 点击连麦Item与media切换,切换两次。
         * 当点击连麦列表item时,media在连麦列表中的其他item,那么要发生两次切换:
         * 1. 先将media和此时主屏幕的那个连麦item进行切换,回到初始默认的位置。
         * 2. 再将此次点击的连麦item与主屏幕的media进行切换。
         *
         * @param switchViewHasMedia     连麦列表的上有media的那个switch view
         * @param switchViewGoMainScreen 被点击的item的switch view,对应将会被切换到主屏幕的连麦item
         */
        void onClickSwitchWithMediaTwice(PLVSwitchViewAnchorLayout switchViewHasMedia, PLVSwitchViewAnchorLayout switchViewGoMainScreen);
        // </editor-fold>

    }
// </editor-fold>
}

4 實作介紹

IPLVLCLinkMicControlBar 的實作類別是 PLVLCLinkMicControlBar。

IPLVLCLinkMicLayout 的實作類別是 PLVLCLinkMicLayout。

4.1 PLVLCLinkMicControlBar

PLVLCLinkMicControlBar 是連麥控制條的實作。有以下幾點需要注意:

  1. 連麥控制條在 Activity 中被建立,並作為參數傳遞到 PLVLCLinkMicLayout 中,由連麥佈局回應控制條的點擊事件以及重新整理連麥控制條的 UI 狀態。

  2. 在直式和橫式螢幕上分別用兩套 View 來實作直式和橫式螢幕的 UI。

  3. 主要的邏輯集中在動畫、點擊事件回應、以及直橫式螢幕兩套 UI 保持同步。

4.2 PLVLCLinkMicLayout

連麥佈局是連麥功能模組的主體,主要的 UI 是連麥列表。且直橫式螢幕共用同一套連麥列表物件。

4.2.1 初始化 View

在初始化時,要初始化連麥列表 RecyclerView 和連麥列表用到的適配器 PLVLinkMicListAdapter。

private void initView() {
    //...
    //init RecyclerView
    rvLinkMicList.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.HORIZONTAL, false));
    rvLinkMicList.addItemDecoration(landscapeItemDecoration);
    //init adapter
    linkMicListAdapter = new PLVLinkMicListAdapter(...)
    //init方向
    curIsLandscape = PLVScreenUtils.isLandscape(getContext());
}
4.2.2 初始化資料

資料的初始化在對外 API 方法中:

@Override
public void init(IPLVLiveRoomDataManager liveRoomDataManager, IPLVLCLinkMicControlBar linkMicControlBar) {
    linkMicPresenter = new PLVLinkMicPresenter(liveRoomDataManager, this);
    initLinkMicControlBar(linkMicControlBar);
}

由於連麥功能模組使用了 MVP 模式,因此首先初始化了 Presenter。

此外,還初始化了連麥控制條,並對連麥控制條的點擊事件進行了監聽。

連麥佈局的主體邏輯主要集中在 MVP 模式的 View 層接口的實作中,可以參考該接口的註解和實作:

interface IPLVLinkMicView {
    /**
     * 响应连麦错误
     */
    void onLinkMicError(int errorCode, Throwable throwable);
    /**
     * 响应讲师开启连麦
     */
    void onTeacherOpenLinkMic();
    /**
     * 响应讲师关闭连麦
     */
    void onTeacherCloseLinkMic();
    /**
     * 响应讲师允许连麦
     */
    void onTeacherAllowJoin();
    /**
     * 响应加入连麦频道超时
     */
    void onAllowButJoinTimeout();
    /**
     * 响应在加入频道之前,View层应创建连麦适配器和初始化连麦布局
     *
     * @param linkMicUid  我的连麦Id
     * @param isAudio     是否是音频连麦
     * @param linkMicList 连麦列表。在实现中,要用该列表去渲染
     */
    void onBeforeJoinChannel(String linkMicUid, boolean isAudio, List<PLVLinkMicItemDataBean> linkMicList);
    /**
     * 响应加入连麦频道成功
     */
    void onJoinChannelSuccess();
    /**
     * 响应离开连麦频道
     */
    void onLeaveChannel();
    /**
     * 响应用户加入连麦频道
     *
     * @param uids
     */
    void onUsersJoin(List<String> uids);
    /**
     * 响应用户离开连麦频道
     *
     * @param uids
     */
    void onUsersLeave(List<String> uids);
    /**
     * 回调我当前不在连麦列表
     */
    void onNotInLinkMicList();
    /**
     * 响应用户开关视频
     *
     * @param uid  用户id
     * @param mute true表示关闭视频,false表示开启视频
     * @param pos  列表中的位置
     */
    void onUserMuteVideo(final String uid, final boolean mute, int pos);
    /**
     * 响应用户开关音频
     *
     * @param uid  用户id
     * @param mute true表示关闭音频,false表示开启音频
     * @param pos  列表中的位置
     */
    void onUserMuteAudio(final String uid, final boolean mute, int pos);
    /**
     * 响应本地用户麦克风音量变化
     */
    void onLocalUserMicVolumeChanged();
    /**
     * 响应远端用户麦克风音量变化
     */
    void onRemoteUserVolumeChanged(List<PLVLinkMicItemDataBean> linkMicList);
    /**
     * 切换第一画面
     *
     * @param linkMicId 新的第一画面的连麦Id
     */
    void onSwitchFirstScreen(String linkMicId);
    /**
     * 设置第一画面的连麦ID
     *
     * @param linkMicId 新的第一画面的连麦Id
     */
    void setFirstScreenLinkMicId(String linkMicId);
    /**
     * 隐藏连麦列表中的讲师item,并根据isNeedSwitchToMain参数决定是否要把该item的view切换到主屏
     *
     * @param linkMicId          讲师的连麦id
     * @param teacherPos         讲师item在当前连麦列表中的索引
     * @param isNeedSwitchToMain 是否要切换到主屏
     */
    void onAdjustTeacherLocation(String linkMicId, int teacherPos, boolean isNeedSwitchToMain);
    /**
     * 切换PPT View和第一画面的位置
     *
     * @param toMainScreen true表示切换到主屏幕,false表示切回到悬浮窗
     */
    void onSwitchPPTViewLocation(boolean toMainScreen);
    /**
     * PPT是否被切换到连麦列表了
     *
     * @return true表示PPT在连麦列表,false表示PPT不在连麦列表
     */
    boolean isMediaShowInLinkMicList();
    /**
     * 获取PPTView在连麦列表中的位置index
     *
     * @return ppt在连麦列表中的位置
     */
    int getMediaViewIndexInLinkMicList();
    /**
     * 点击连麦列表[index]位置上的画面
     *
     * @param index 连麦列表中的位置
     */
    void performClickInLinkMicListItem(int index);
    /**
     * 更新所有整个连麦列表
     */
    void updateAllLinkMicList();
}

5 子目錄介紹

5.1 adapter 目錄

  1. PLVLinkMicListAdapter

    連麥列表 RecyclerView 的適配器,該類別中對具體的每個連麥 Item 做了處理,並暴露了連麥 Item 的點擊事件。

5.2 service 目錄

  1. PLVLCLinkMicForegroundService

    在連麥時開啟前景服務來確保在背景連麥時,連麥功能正常。

5.3 widget 目錄

這是連麥模組的自訂 View 目錄

  1. PLVLCLinkMicRingButton

    連麥麥克風按鈕

  2. PLVLinkMicRvLandscapeItemDecoration

    橫式螢幕連麥列表的 ItemDecoration

联系客服,在线咨询