更新时间:2024-09-13 GMT+08:00

界面配置

Config

接口描述

Windows SDK中已经提供了会议中的界面,界面上的部分元素是可以自定义的。可以自定义的界面元素如下:

  • 会议窗口名称

会议开始后,在Windows任务栏上会生成一个会议的图标,鼠标指向该图标时会显示会议的缩略窗口,该窗口的名称可以自定义。

图1 会议窗口名称

会议窗口的图标,可以替换HwmSdk\sdkResources\nativeimg目录下的video.ico图标文件。

  • 会议信息及会议链接前缀

会议链接的域名前缀默认是https://bmeeting.huaweicloud.com/(如https://bmeeting.huaweicloud.com/#/j/982989574),如果入会Portal是第三方自己开发的,这个前缀需要自定义。

整个会议信息也可以自定义显示或者隐藏。

图2 会议信息
  • 来电窗口

会议来电窗口默认在收到来电时弹出,可配置成隐藏,在收到来电通知时调用会议来电应答接口来应答:

图3 来电窗口

  • 会控按钮
  1. 删除或者修改SDK中自带的会控按。具体可以删除和修改的按钮见按钮ID定义表
  2. 自定义新增按钮。具体用例见自定义会控按钮
图4 底部工具栏和更多菜单

图5 共享工具栏和更多菜单

图6 自定义子菜单项:

  • 自定义会议信息窗口
图7 自定义会议信息框

图8 状态工具栏

图9 与会者详情头像点击

自定义会议信息窗口请参考“显示会议信息框”和“销毁会议信息框”。

注意事项

  1. 只有需要更改会议界面默认显示样式时,才需要调用该接口,若默认样式已满足要求,可以不调用该接口。
  2. 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。

方法定义

1
HWM_SDK_AGENT_API hwmsdk::HwmErrCode Config(char uiConfig[HWM_MAX_CONFIG_LEN]);

Config接口不能连续调用,如果需要调用两次Config接口,一定要等第一次OnConfigResult回调函数处理完成后,再调用第二次Config。

回调函数

1
virtual void OnConfigResult(hwmsdk::HwmErrCode ret, const char* reason) {};

参数描述

表1 参数说明

参数

是否必须

类型

描述

uiConfig

char[]

Json对象字符串"{"frame":object}", object对象有格式要求,若不匹配则配置不生效。详细规则见以下表格。

表2 frame对象介绍

key

value类型

描述

name

string

会议窗口名称。如图1中的窗口名称(MyApp)。

linkPrefix

string

会议窗口中分享的会议链接前缀。如图2中复制出来的会议链接。

confMenu

object

会议窗口上的按钮配置对象。如图4图5中的4类按钮。

isUseExternalConfInfoWnd

bool

会议窗口中自定义分享会议信息框开关。如图6中的窗口。"true" :开启 ;"false" :关闭,默认 "false" 关闭。

isUseExternalAddressBook

bool

会议窗口中使用外部通讯录头像信息的开关。"true": 使用 ;"false": 不使用,默认 "false"不使用

isHideConfIncomingWindow

bool

是否隐藏会议来电弹窗。"true":隐藏,会议来电不弹窗;"false"不隐藏,正常弹窗,默认不隐藏,正常弹窗。

defaultWindowMode

int

会议窗口模式。0 通常;1最大化;2全屏。默认通常。

isCloseSideWindow

bool

是否关闭侧边窗口: "false": 不关闭;"true":关闭。默认不关闭。

flowControlInitShowPos

int

共享工具栏初始化位置:0:顶部 1:底部。默认显示顶部。

defaultWindowMonitor

int

会议窗口入会时默认创建在哪个显示器:0主显示器,1副显示器。默认在主显示器。

isHideTransferHostBeforeLeave

bool

是否隐藏离会时指定主持人功能按钮:"false": 不隐藏;"true":隐藏。默认不隐藏。

isUploadKeyLog

bool

是否自动收集日志的开关。"true":收集;"false": 不收集。默认"true"收集。

表3 confMenu对象介绍

key

value类型

描述

toolBar

object

会议窗口上的按钮配置对象。如图4图5中的4类按钮。

titleBar

object

会议窗口上的标题栏配置对象。如图2中的会议信息。

statusBar

object

会议窗口左上角的状态栏配置对象。如图8中的按钮

表4 toolBar对象子key介绍

key

value类型

描述

button

object[]

会议窗口上的按钮配置对象。如图4图5中的4类按钮和菜单。

customButton

object[]

会议窗口上的第三方自定义按钮配置对象。如图4中的③④和图5中的①②。

表5 statusBar对象子key介绍

key

value类型

描述

button

object[]

会议窗口左上角的状态栏上的按钮配置对象。如图8中的按钮。

表6 button对象子key介绍

key

value类型

描述

id

string

按钮的唯一标识。具体id与按钮的对应关系见表9

showAsAction

string

是否显示。只有2个取值,“never”:不显示,“ifRoom”:显示。

isCustomizedClick

bool

是否点击注入。true:点击注入,用户点击按钮时发送通知消息,SDK不做点击响应处理。

表7 customButton对象子key介绍

key

value类型

描述

id

string

第三方自定义的按钮id。如“customMenu”。

title

string

第三方自定义按钮的显示的名称。如“自定义按钮”。

buttonImg

string

第三方自定义按钮的图标路径,使用绝对路径。如“to/path/image.svg”,支持svg/png等格式

注:需要UTF8编码。

buttonPos

int

第三方自定义按钮的位置。0:工具栏更多菜单,1:底部工具栏,2:共享工具栏

subMenu

object[]

第三方自定义按钮的子菜单项。*(最多配置到三级:深入两次)

表8 subMenu对象子key介绍

key

value类型

描述

id

string

第三方自定义的按钮id。如“customMenu”。

title

string

第三方自定义按钮的显示的名称。如“自定义按钮”。

buttonImg

string

第三方自定义按钮的图标路径,使用绝对路径。如“to/path/image.svg”,支持svg/png等格式

注:需要UTF8编码。

subMenu

object[]

第三方自定义按钮的子菜单项。

表9 按钮id介绍

按钮名称

按钮id

说明

麦克风

"microphone"

可隐藏

扬声器

"speaker"

可隐藏

摄像头

"camera"

可隐藏

邀请

"invite"

可隐藏,可注入

离开

"leave"

可隐藏,可注入

共享

"share"

可隐藏,可注入

与会者

"attendee"

可隐藏,可注入

呼叫其它号码

"call_other_number"

可隐藏,可注入

反馈

"feedback"

可隐藏,可注入

举手/手放下

"hands_up"

可隐藏

申请主持人/释放主持人

"change_chairman_auth"

可隐藏

改名

"rename"

可隐藏

锁定会议

"lock_conf"

可隐藏

标注

"annotation"

可隐藏

授予远程控制

"remote_control"

可隐藏

停止共享

"stop_share"

可隐藏

聊天

"chat"

可隐藏,可注入

导出与会者

"export_participants"

可隐藏

入会范围

"attendee_access_control"

可隐藏

允许共享

"lock_Share"

可隐藏

字幕功能:开启字幕、字幕翻译

"subtitle"

可隐藏

安全

"security"

可隐藏

邀请共享、取消共享

"invite_or_cancel_share"

可隐藏

隐藏无视频与会者

"hide_no_video_view"

可隐藏

视频画面智能排序

"video_smart_sorting"

可隐藏

虚拟背景

"virtual_background"

可隐藏

网络检测

"network_detection"

可隐藏

全场静音/取消全场静音

"mute_all"

可隐藏

允许与会者解除静音

"allow_unmute"

可隐藏

打开/关闭双屏模式

"dual_screen"

可隐藏

录制

"record"

可隐藏

投票

"vote"

可隐藏

共享画面质量策略:清晰度优先、流畅度优先

"share_strategy"

可隐藏

共享时隐藏视频窗口

"share_hide_video"

可隐藏

共享时包含电脑声音

"share_audio"

可隐藏

复制会议信息

"copy_conf_info"

可注入

全员移入等候室

"moveall_to_waitingroom"

可隐藏

与会者详情

"participant_detail"

可注入,见图9

复制观众链接

"copy_audience_conf_info"

可注入

表10 titleBar对象子key介绍

key

value类型

描述

confDetail

object[]

图2中的会议信息。showAsAction设置成never后,不显示会议信息。

表11 confDetail的对象key介绍

key

value类型

描述

showAsAction

string

是否显示。只有2个取值,“never”:不显示,“ifRoom”:显示。

button

object[]

会议信息窗口上的按钮配置对象。

按照上面的定义,完整的可定制的界面元素的json格式配置项如下:
{
    "frame":{
        "name":"MyApp",
        "linkPrefix":"https://www.demo.com/",
        "isUseExternalConfInfoWnd":false,
        "isUseExternalAddressBook":false,
        "confMenu":{
            "titleBar":{
                 "confDetail":{
                      "showAsAction":"never",
                 "button":[
                     {
                        "id":"copy_conf_info",
                        "isCustomizedClick":false
                     }
                  ]
            },
            "statusBar": {        
                  "button": [          
                      {            
                          "id": "record",            
                          "showAsAction": "never"          
                      }       
                    ]      
             },
            "toolBar":{
                "customButton": [
                   {
		        "id": "customMenu",
			"title": "自定义按钮",
                        "buttonImg": "D:/demoResource/icon-whiteboard.svg",
                        "buttonPos": 1
		    }],
                "button":[
                    {
                        "id":"microphone",
                        "showAsAction":"ifRoom"
                    },
                    {
                        "id":"speaker",
                        "showAsAction":"ifRoom"
                    },
                    {
                        "id":"camera",
                        "showAsAction":"ifRoom"
                    },
                    {
                        "id":"invite",
                        "showAsAction":"ifRoom",
                        "isCustomizedClick":true
                    },
                   {
                        "id":"leave",
                        "showAsAction":"ifRoom",
                        "isCustomizedClick":true
                    },
                   {
                        "id":"share",
                        "showAsAction":"never",
                        "isCustomizedClick":true
                    },
                   {
                        "id":"attendee",
                        "showAsAction":"ifRoom",
                        "isCustomizedClick":true
                    },
                   {
                        "id":"call_other_number",
                        "showAsAction":"ifRoom",
                        "isCustomizedClick":true
                    },
                   {
                        "id":"feedback",
                        "showAsAction":"never"
                    },
                   {
                        "id":"hands_up",
                        "showAsAction":"never"
                    },
                   {
                        "id":"change_chairman_auth",
                        "showAsAction":"never",
                        "isCustomizedClick":false
                    },
                   {
                        "id":"rename",
                        "showAsAction":"never"
                    },
                   {
                        "id":"lock_conf",
                        "showAsAction":"never"
                    },
                   {
                        "id":"annotation",
                        "showAsAction":"never"
                    },
                   {
                        "id":"remote_control",
                        "showAsAction":"never"
                    },
                   {
                        "id":"stop_share",
                        "showAsAction":"never"
                    },
                   {
                        "id":"chat",
                        "showAsAction":"ifRoom",
                        "isCustomizedClick":true
                    },
                   {
                        "id":"export_participants",
                        "showAsAction":"never"
                    },
                   {
                        "id":"attendee_access_control",
                        "showAsAction":"never"
                    },
                   {
                        "id":"network_detection",
                        "showAsAction":"never"
                    },
                   {
                        "id":"mute_all",
                        "showAsAction":"never"
                    },
                   {
                        "id":"allow_unmute",
                        "showAsAction":"never"
                    },
                   {
                        "id":"dual_screen",
                        "showAsAction":"never"
                    },
                   {
                        "id":"record",
                        "showAsAction":"never"
                    },
                   {
                        "id":"vote",
                        "showAsAction":"never"
                    }
                ]
            }
        }
    }
}

由于函数Config的uiConfig是字符数组,需要把上述的json转换成字符串形式,请参考下面的示例代码。

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
* UI界面配置
*/
int hwmSDKConfigUI::hwmSDKStartUIConfigTotal()
{
    CString start = "{\"frame\":{";
 
    //会议窗口名称
    CString name = "\"name\":\"MyApp\"";
 
    //会议链接前缀
    CString linkPrefix = "\"linkPrefix\":\"https://www.demo.com/\"";
    //自定义外部会议信息框开关
    CString isUseExternalConfInfoWnd = "\"isUseExternalConfInfoWnd\":\"false\"";
    //外部通讯录开关
    CString isUseExternalAddressBook = "\"isUseExternalAddressBook\":\"false\"";
    CString menuStart = "\"confMenu\":{";
    //会议信息
    CString titleBar = "\"titleBar\":{\"confDetail\":{\"showAsAction\":\"ifRoom\"}}";
    CString toolBarStart = "\"toolBar\":{";
    //自定义按钮
    CString customMenuStart = "\"customButton\":[";
    CString customMenu1 = "{\"id\":\"customMenu1\",\"title\":\"自定义按钮1\"}";
    CString customMenu2 = "{\"id\":\"customMenu2\",\"title\":\"自定义按钮2\"}";
    CString customMenuEnd = "]";
 
    //会控按钮
    CString buttonStart = "\"button\":[";
    CString inviateButton = "{\"id\":\"invite\",\"showAsAction\":\"ifRoom\",\"isCustomizedClick\":true}";
    CString leaveButton = "{\"id\":\"leave\",\"showAsAction\":\"ifRoom\",\"isCustomizedClick\":true}";
    CString callButton = "{\"id\":\"call_other_number\",\"showAsAction\":\"ifRoom\",\"isCustomizedClick\":true}";
    CString attendeeButton = "{\"id\":\"attendee\",\"showAsAction\":\"ifRoom\",\"isCustomizedClick\":true}";
    CString shareButton = "{\"id\":\"share\",\"showAsAction\":\"ifRoom\",\"isCustomizedClick\":true}";
    CString annotationButton = "{\"id\":\"annotation\",\"showAsAction\":\"never\"}";
    CString stopshareButton = "{\"id\":\"stop_share\",\"showAsAction\":\"never\"}";
    CString feedbackButton = "{\"id\":\"feedback\",\"showAsAction\":\"never\"}";
    CString remotecontrolButton = "{\"id\":\"remote_control\",\"showAsAction\":\"never\"}";
    CString handsupButton = "{\"id\":\"hands_up\",\"showAsAction\":\"never\"}";
    CString changechairmanButton = "{\"id\":\"change_chairman_auth\",\"showAsAction\":\"never\"}";
    CString renameButton = "{\"id\":\"rename\",\"showAsAction\":\"never\"}";
    CString lockconfButton = "{ \"id\":\"lock_conf\",\"showAsAction\":\"never\"}"
    CString chatButton = "{\"id\":\"chat\",\"showAsAction\":\"never\"}";
    CString exportButton = "{\"id\":\"export_participants\",\"showAsAction\":\"never\"}";
    CString accessButton = "{\"id\":\"attendee_access_control\",\"showAsAction\":\"never\"}";
 
    CString buttonEnd = "]";
    CString toolBarEnd = "}";
    CString menuEnd = "}";
    CString end = "}}";
 
    CString customMenu = customMenuStart + customMenu1 + "," + customMenu2 + customMenuEnd;
    CString button = buttonStart + inviateButton + "," + leaveButton + "," \
        + callButton + "," + attendeeButton + "," + shareButton + "," + annotationButton + "," + stopshareButton + ","\
        + feedbackButton + "," + remotecontrolButton + "," + handsupButton + "," + changechairmanButton + "," + renameButton + ","\
        + lockconfButton + "," + chatButton + "," + exportButton  + "," + accessButton + buttonEnd;
 
    CString menu = menuStart + "," + titleBar + toolBarStart + customMenu + "," + button + toolBarEnd + menuEnd;
    CString config = start + name + "," + linkPrefix + "," + isUseExternalConfInfoWnd + "," + isUseExternalAddressBook + "," + menu + end;
    
    //转换成UTF8格式
    string uiConfig = CTools::UNICODE2UTF(config);
    int ret = hwmsdkagent::Config(uiConfig);
    return ret;
}