功能模块(投票,文档,抽奖,弹幕,只看主播等) - mengzhuSDK/MengzhuSDK_Android GitHub Wiki

1 投票弹窗实现

VoteDialogFragment voteDialogFragment = (VoteDialogFragment) getFragmentManager().findFragmentByTag("VOTEDIALOGFRAGMENT");
            if (null == voteDialogFragment) {
                voteDialogFragment = VoteDialogFragment.newInstance(mPlayInfoDto);
            }
            if (!voteDialogFragment.isAdded() && !voteDialogFragment.isVisible() && !voteDialogFragment.isRemoving()) {
                voteDialogFragment.show(getFragmentManager(), "VOTEDIALOGFRAGMENT");
            }

1.1 如需自己实现查看api文档投票相关接口,以及demo实现方式。

2 投屏弹窗实现

ChannelDlnaDialogFragment dlanDialogFragment = (ChannelDlnaDialogFragment) getFragmentManager().findFragmentByTag("DLANDIALOGFRAGMENT");
            if (null == dlanDialogFragment) {
                ChannelDlnaDialogFragment.Builder builder = new ChannelDlnaDialogFragment.Builder(mActivity);
                builder.setOnDeviceItemSelectListener(new ChannelDlnaDialogFragment.OnDeviceItemSelectListener() {
                    @Override
                    public void onSelectDevice() {
                        startDlan();
                    }
                });
                builder.setTitleTextColor(getResources().getColor(R.color.color_782d16));
                builder.setTopRightBtnVisible(View.VISIBLE);
                dlanDialogFragment = builder.build();
            }
            if (!dlanDialogFragment.isAdded() && !dlanDialogFragment.isVisible() && !dlanDialogFragment.isRemoving()) {
                dlanDialogFragment.show(getFragmentManager(), "DLANDIALOGFRAGMENT");
            }

2.1 投屏相关api,在api文档投屏控制类。

3 文档fragment实现

ViewDocumentFragment mViewDocumentFragment = ViewDocumentFragment.newInstance(PlayInfoDto playInfoDto, boolean isShow //是否显示关闭按钮);

com.mengzhu.live.sdk.core.utils.FileUtils.getDocumentPptFile()      //获取文档下载存放路径                                              /**
     * 读取文档ppt目录的所有文件
     *
     * @param files    返回的所有文件
     * @param filePath 路径(可传入sd卡路径)
     * @return
     */   
com.mengzhu.live.sdk.core.utils.FileUtils.getSuffixFile(List<File> files, String filePath)     // 获取路径下的所有文档文件                                                                         

3.1 文档相关消息回调

MZChatManager.getInstance(mActivity).registerListener(CLASSNAME, new MZChatMessagerListener() {

            @Override
            public void dataResult(Object obj, Page page, int status) {

            }

            @Override
            public void errorResult(int code, String msg) {

            }

            @Override
            public void monitorInformResult(String type, Object obj, Object extend) {
                
            }

            @Override
            public void monitorInformResult(String s, Object o) {
                ChatMessageDto mChatMessage = (ChatMessageDto) o;
                ChatTextDto mChatText = mChatMessage.getText();
                BaseDto mBase = mChatText.getBaseDto();
                switch (s) {
                    
                    case ChatMessageObserver.CMD_TYPE:
                        ChatCmdDto mChatCmd = (ChatCmdDto) mBase;
                        switch (mChatCmd.getType()) {
                            case ChatPresenter.DOCSWITCHPAGE:
                                // 翻页
                                ArrayList<String> list = new ArrayList<>();
                                list.add(mChatCmd.getUrl());
                                if (mViewDocumentFragment != null) {
 mViewDocumentFragment.initViewPager(list);		                      mViewDocumentFragment.setDocumentName(mChatCmd.getFile_name());
                                }
                                break;
                            
                        }
                        break;
                }
            }

            @Override
            public void monitorInformError(String s, int i, String s1) {

            }
        });

3.2 文档相关API接口,查看API文档对应

4 小窗播放示例

private void initWindow(){
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        int widthPixels = getResources().getDisplayMetrics().widthPixels;
        int width = (int) (widthPixels * 0.8f);
        int type;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){//8.0+
            type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        }else {
            type =  WindowManager.LayoutParams.TYPE_PHONE;
        }
        mWindowVideoContainer = new FrameLayout(this);
        mFloatWindow = new FloatWindow(this, mWindowVideoContainer,
                new FloatWindowParams()
                        .setWindowType(type)
                        .setX(100)
                        .setY(400)
                        .setWidth(width)
                        .setHeight(width*9/16));
        mFloatWindow.setBackgroundColor(Color.BLACK);
    }
private void windowPlay() {
        if(!mFloatWindow.isWindowShow()){

            mFloatWindow.setElevationShadow(20);
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
                mFloatWindow.setRoundRectShape(50);
            mFloatWindow.show();
            ViewParent parent = mzPlayerView.getParent();
            if(parent!=null && parent instanceof ViewGroup){
                ((ViewGroup) parent).removeView(mzPlayerView);
            }
            mWindowVideoContainer.addView(mzPlayerView,
                    new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                            ViewGroup.LayoutParams.MATCH_PARENT));
        }
    }

5 签到

public void showSignDialog(){
        if (signInfoBean == null || mActivity == null || signDialogShowing)
            return;
        final SignInWebFragment signInWebFragment = new SignInWebFragment(mActivity , mPlayInfoDto , signInfoBean);
        signInWebFragment.setSignInOutSideDismiss(false);
        signInWebFragment.setOnDismissListener(new SignInWebFragment.OnDismissListener() {
            @Override
            public void onDismiss(boolean isSign) {
                signDialogShowing = false;
                signInWebFragment.onDestroy();
                if (isSign){
                    mIvSignIn.setImageResource(R.mipmap.icon_mz_signed);
                }
            }
        });
        PreferencesUtils.savePrefBoolean(mActivity,mPlayInfoDto.getTicket_id() +signInfoBean.getSign_id() + mPlayInfoDto.getUnique_id(),true);
        signInWebFragment.showAtLocation(mActivity.findViewById(android.R.id.content), Gravity.CENTER, 0, 0);
        signDialogShowing = true;
    }

5.1

签到实例化SignInWebFragment 传入 当前上下文对象,playinfo数据,以及playinfo下的签到实体数据类,具体实现参考API文档接口,以及demo逻辑实现。

6 弹幕

//消息弹幕监听
    public void receiveSendDanmaku(Object obj) {
        ChatMessageDto mChatMessage = (ChatMessageDto) obj;
        ChatTextDto mChatText = mChatMessage.getText();
        ChatMegTxtDto megTxtDto = (ChatMegTxtDto) mChatText.getBaseDto();
        boolean isSelf = megTxtDto.getUniqueID().equals(MyUserInfoPresenter.getInstance().getUserInfo().getUniqueID());
        if (isSelf) {
            mzPlayerView.setDanmakuCustomTextColor(getResources().getColor(R.color.color_fff45c));
            //消息文本 , 直播状态 , 头像,弹幕样式
            mzPlayerView.sendDanmaku(mChatText.getUser_name() + ":  " + megTxtDto.getText(), liveStatus == 1, mChatText.getAvatar(), new DanmakuViewCacheStuffer(mActivity, mzPlayerView.getDanmakuView()));
        } else {
            mzPlayerView.setDanmakuCustomTextColor(getResources().getColor(R.color.white));
            mzPlayerView.sendDanmaku(mChatText.getUser_name() + ":  " + megTxtDto.getText(), liveStatus == 1, mChatText.getAvatar(), new DanmakuViewCacheStuffer(mActivity, mzPlayerView.getDanmakuView()));
        }
    }

7 观看权限

控制台配置活动观看的权限方式白名单,F码等,前端源码封装可直接使用,使用方式如下:

MZWatchAuthPopWindow uthPopWindow = new MZWatchAuthPopWindow(this, mTicketId, phone);
        authPopWindow.setOnCheckResultListener(new MZWatchAuthPopWindow.OnCheckResultListener() {
            @Override
            public void onSuccess() {
                //权限验证成功 进入观看页
            }

            @Override
            public void onFailed() {
            //权限验证失败
                finish();
            }
        });
authPopWindow.showAtLocation(getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);

具体封装和使用可查看MZMediaSDK 的MZWatchAuthPopWindow查看源码以及调用方式

8 抽奖系统

控制台配置抽奖,前台封装web加载,具体使用方式如下:

/**
     * 抽奖弹窗
     */
    public void showLottoDialog(){
        MZLottoWebFragment lottoWebFragment = new MZLottoWebFragment(mActivity,lottoBean,"抽奖");
        lottoWebFragment.setLottoOutSideDismiss(true);
        lottoWebFragment.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {

            }
        });
        lottoWebFragment.showAtLocation(mActivity.findViewById(android.R.id.content), Gravity.CENTER, 0, 0);
    }

// 控制台消息控制  ChatPresenter.WEBINAR_VIEW_CONFIG_UPDATE: //弹幕,禁言,防录屏,等配置开关
对应type类型为
case PlayInfoDto.PRIZE:
     mPlayInfoDto.setLottoShow(isOpen);
 break;
 控制显示与否

具体封装和使用可查看MZMediaSDK 的HalfPlayerFragment查看源码以及调用方式

9 主播功能

9.1 MZChatManager使用

// 设置主播uid,通过获取主播信息接口回去
public void setAnchorUid(String anchorUid)

// 获取当前是否开启只看主播功能
public boolean isOnlyAnchor()

//打开或关闭只看主播功能 更改会触发回调事件
public void setOnlyAnchor(boolean onlyAnchor)

//注册只看主播开关监听回调
public void registerChangeIsOnlyAnchorListener(String key , ChatPresenter.OnChangeISOnlyAnchorListener listener)

// 取消监听
public void removeListener(String key)

9.2 回调事件

// 注册只看主播切换监听事件
        MZChatManager.getInstance(mActivity).registerChangeIsOnlyAnchorListener(PlayerChatListFragment.class.getSimpleName() , changeISOnlyAnchorListener);
        
ChatPresenter.OnChangeISOnlyAnchorListener changeISOnlyAnchorListener = new ChatPresenter.OnChangeISOnlyAnchorListener() {
        @Override
        public void changeIsOnlyAnchor(boolean isOnlyAnchor, List<ChatMessageDto> messageList) {
//            isOnlyAnchor 是否是只看主播 messageList切换后的列表数据
        }
    };

具体使用方式可参考MZMediaSDK 中的PlayerChatListFragment 使用方式

⚠️ **GitHub.com Fallback** ⚠️