华为云用户手册

  • 快速入门 在将Electron SDK集成到第三方应用中前,请先按照“跑通Electron Demo”中的指导熟悉Electron客户端中集成华为云会议Electron SDK的基本流程。 将华为云会议Windows SDK集成到第三方的Electron客户端的步骤如下: 下载Electron SDK。 解压Electron SDK,得到如下目录及文件: 图1 SDK包目录结构 拷贝Electron SDK文件 1. 如果已经安装node,请先确定自己node版本是32位还是64位,可以执行cmd/shell命令查看node版本的位数,结果:x64为64位, ia32为32位。 $ node -p "process.arch" 2. 如果没有安装node,可到nodejs官网下载对应版本。 如果平台是windows,node版本是32位,执行步骤1中解压目录下的run_demo_win32.bat 如果平台是windows,node版本是64位,执行步骤1中解压目录下的run_demo_x64.bat 如果平台是mac,执行步骤1中解压目录下的run_demo_mac.sh bat或sh脚本的作用: 编译ts接口,生成js和types文件。 将对应平台的的SDK文件拷贝到对应的目录下("sdk/win32"、"sdk/x64"、"sdk/mac")。 运行Demo。 复制js和types目录及其下的子目录和文件、根目录下面的package.json到项目的某个目录下(如果项目使用的是TypeScript,则复制ts目录及其下的子目录和文件)。 第三方应用需要调用的JavaScript接口都在js文件夹中,入口文件为js\index.js(如果项目使用的是TypeScript,入口文件为ts\index.ts)。 增加依赖 参考demo中package.json增加依赖。 1 2 3 "dependencies": { "electron": "^13.6.7" }, 通过import方式,引用Electron sdk的接口文件所在目录,初始化UISDKService对象,同时设置node路径加载sdk 参考demo中的AppService.js/NotifyService.js代码。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import UISDKService from 'hwmsdk-electron'; const os = window.require('os'); const platform = os.platform(); const arch = os.arch(); const path = window.require("path"); let instance = null; export default class ApiService { constructor() { if (!instance) { instance = this; // node路径请根据实际的路径传入UISDKService构造函数 let _path = (platform == 'darwin' ? './../sdk/mac/' : arch == 'x64' ? './../sdk/x64/' : './../sdk/win32/'); let nodePath = path.join(window.__dirname, (_path + "HwmUisdk.node")); console.log("ApiService nodePath", nodePath); this.uisdkService = new UISDKService(nodePath); } return instance; } } 接口调用 华为云会议的接口调用和消息通知的处理时序请参考“典型场景接口调用概览”。 第三方应用可以调用的JavaScript接口都在js/api/中,可以参考Demo中的AppService/ApiService.js,调用这些接口。 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 import UISDKService from 'hwmsdk-electron'; const os = window.require('os'); const platform = os.platform(); const arch = os.arch(); const path = window.require("path"); let instance = null; export default class ApiService { constructor() { if (!instance) { instance = this; // node路径请根据实际的路径传入UISDKService构造函数 let _path = (platform == 'darwin' ? './../sdk/mac/' : arch == 'x64' ? './../sdk/x64/' : './../sdk/win32/'); let nodePath = path.join(window.__dirname, (_path + "HwmUisdk.node")); console.log("ApiService nodePath", nodePath); this.uisdkService = new UISDKService(nodePath); } return instance; } init(initInfo) { console.log("init, in param = ", initInfo); let ret = this.uisdkService.init(initInfo); console.log("init, out data = ", ret); return ret; } } 订阅事件通知 订阅第三方可以收到的通知JavaScript接口也都在js/api/中,可以参考Demo中的AppService/NotifyService.js,订阅这些通知。 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 import UISDKService from 'hwmsdk-electron'; const os = window.require('os'); const platform = os.platform(); const arch = os.arch(); const path = window.require("path"); export default class NotifyService { static setNotifyFunc() { let _path = (platform == 'darwin' ? './../sdk/mac/' : arch == 'x64' ? './../sdk/x64/' : './../sdk/win32/'); let nodePath = path.join(window.__dirname, (_path + "HwmUisdk.node")); console.log("NotifyService nodePath", nodePath); let uisdkService = new UISDKService(nodePath); uisdkService.getConfMgrApi().setOnConfListChangedCB(NotifyService.handleOnConfListChanged); } static handleOnConfListChanged(confListInfo) { console.log('OnConfListChanged', ', confListInfo = ', confListInfo); let _confListInfo = window.sessionStorage.getItem("confListInfo"); _confListInfo = _confListInfo ? JSON.parse(_confListInfo) : []; console.log("sessionStorage confList:", _confListInfo); let conflistNew = confListInfo.confListItem; let _data = JSON.stringify(conflistNew ? conflistNew : []); window.sessionStorage.setItem("confListInfo", _data); } } 使用Electron sdk提供的枚举(可选) 第三方可以直接使用Electron sdk提供的枚举定义,拷贝packages/hwmsdk-electron/js/Api/enum.js和packages/hwmsdk-electron/types/Api/enum.d.ts到项目的某个目录下,参考Demo中的packages/hwmsdk-electron-demo/src/Constants/typeOption.js,使用这些枚举定义。 1 2 3 4 5 6 7 8 9 10 11 12 import { MediaType } from "./enum"; export const MediaTypeOptions = [ { value: MediaType.HWM_MEDIA_TYPE_AUDIO, label: "Audio", }, { value: MediaType.HWM_MEDIA_TYPE_VIDEO, label: "Video", } ]; 父主题: Electron SDK
  • 自定义会中UI行为通知 在OpenSDKConfig中配置会议UI页面变更相关的通知监听 入会的时候UI创建,离会的时候销毁UI 使用场景 入会场景:onConfDetailNotify 离会场景:onConfEnded、onLeaveConf 弱网提示:onPoorNetworkQualityInfoNotify 立即会议通话记录通知:onP2PConfRecord 注意事项 SDK初始化的时候必须传入这个配置sdkConfig才会生效 示例代码 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 public class CustomNotifyHandler implements CLMNotifyHandler { @Override public void onConfDetailNotify(ConfInfo confInfo) { Log.i(TAG, "confInfo: confId" + confInfo.getConfId() + ", Subject:" + confInfo.getConfSubject()); } @Override public void onPoorNetworkQualityInfoNotify(PoorNetWorkQualityInfo poorNetWorkInfo) { Log.i(TAG, " poorNetWorkInfo : " + poorNetWorkInfo.getUserId() + " , " + " , " + poorNetWorkInfo.getIsLocal() + " , " + poorNetWorkInfo.getVideoStatus() + " , " + poorNetWorkInfo.getAudioStatus() + " , " + poorNetWorkInfo.getShareStatus()); DemoUtil.showToast("CLMNotifyHandler 事件: onPoorNetworkQualityInfoNotify "); } /** * 会议结束后,会收到通知 * @param result 会议结束后的错误码 */ @Override public void onConfEnded(ConfEndedReason result) { Log.i(TAG, "会议已结束"); } @Override public void onLeaveConf(int result) { Log.i(TAG, "您已离开会议"); } } sdkConfig.setNotifyHandler(new CustomNotifyHandler()); 离开会议通知 会议结束通知 会议详情通知 会议弱网提示通知 立即会议通话记录通知 父主题: 通知参考
  • CancelSubCycleConf 接口描述 该接口用于取消未开始的周期子会议。 注意事项 该接口在登录状态下才能调用。 子会议未开始前可以调用接口,开始后调用则无效。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode CancelSubCycleConf(const HwmCancelSubCycleConfParam *cancelSubCycleConfParam); 回调函数 1 virtual void OnCancelSubCycleConfResult(hwmsdk::HwmErrCode ret, const char* reason) {}; 参数描述 表1 结构体HwmCancelCycleConfParam参数说明 参数 是否必须 类型 描述 confId 是 char[] 会议id subConfID 是 char[] 子会议唯一标识UUID endOnlineConf 是 bool 是否需要结束在线会议 示例代码 1 2 3 4 5 6 7 8 9 10 11 /** * 取消周期子会议接口 */ int demoSubCycleConfList::CancelSubCycleConf() { hwmsdkagent::HwmCancelSubCycleConfParam subCycleConfParam{}; strcpy_s(subCycleConfParam.confId, sizeof(subCycleConfParam.confId), m_confInfo.confListInfo.confId); strcpy_s(subCycleConfParam.subConfID, sizeof(subCycleConfParam.subConfID), m_subCycleConfID.c_str()); subCycleConfParam.endOnlineConf = true; hwmsdkagent::CancelSubCycleConf(&subCycleConfParam); }
  • 会议详情通知 接口描述 获取会议详情收到该通知,入会的时候会收到一次。 方法定义 1 2 3 4 5 6 /** * 会议详情的上报 * * @param confInfo */ void onConfDetailNotify(ConfInfo confInfo); 参数描述 表1 参数说明 参数 是否必须 类型 描述 confInfo 是 ConfInfo 会议信息 返回值 无。 参数拓展 表2 ConfInfo参数说明 参数 是否必须 类型 描述 confSubject 是 String 会议主题 confId 是 String 会议ID vmrConferenceId 是 String 个人会议ID confPwd 否 String 入会密码 confAccessNum 是 String 接入号 confChairPwd 是 String 主持人密码 confGuestUri 是 String guest入会uri confStartTime 是 String 会议开始时间 confEndTime 是 String 会议结束时间 confScheduserName 是 String 创建者名字 confOrgId 是 String 判断是否外部用户 mediaType 是 int 会议类型 CONF_MEDIA_TYPE_AUDIO = 1; 音频 CONF_MEDIA_TYPE_VIDEO = 2; 视频 CONF_MEDIA_TYPE_HDVIDEO = 4; 高清视频 CONF_MEDIA_TYPE_DATA = 16; 数据 父主题: 自定义会中UI行为通知
  • EndConf 接口描述 该接口用于结束会议。 注意事项 不在会议中不应调用此接口。 调用该接口,会议将结束,无法再次加入该会议。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode EndConf(); 回调函数 1 virtual void OnEndConfResult(hwmsdk::HwmErrCode ret, const char* reason) {}; 参数描述 无。 返回值 表1 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 示例代码 1 2 3 4 5 6 7 8 9 10 11 /** * 结束会议 */ void demoConfCtrlDlg::OnBnClickedButtonStopConf() { int ret = hwmsdkagent::EndConf(); if (hwmsdk::HWM_COMMON_SUCCESS != ret) { AfxMessageBox(_T("EndConf error")); } }
  • LeaveConf 接口描述 该接口用于离开会议。 注意事项 不在会议中不应调用此接口。 调用该接口离开会议,会议不会结束,在会议存在期间可以再次入会。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode LeaveConf(); 回调函数 1 virtual void OnLeaveConfResult(hwmsdk::HwmErrCode ret, const char* reason) {}; 参数描述 无。 返回值 表1 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 示例代码 1 2 3 4 5 6 7 8 9 10 11 /** * 离开会议 */ void demoConfCtrlDlg::OnBnClickedButtonLeaveConf() { int ret = hwmsdkagent::LeaveConf(); if (hwmsdk::HWM_COMMON_SUCCESS != ret) { AfxMessageBox(_T("LeaveConf error")); } }
  • GetMainWindowInfo 接口描述 该接口用于获取主窗口信息。 注意事项 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode GetMainWindowInfo(); 回调函数 1 virtual void OnGetMainWindowInfoResult(hwmsdk::HwmErrCode ret, const char* reason, const HwmMainWindowInfo *mainWindowInfo) {}; 参数描述 表1 结构体HwmMainWindowInfo参数说明 参数 类型 描述 x int 窗口相对于屏幕左侧的偏移量。 y int 窗口相对于屏幕顶端的偏移量。 width int 窗口的宽度。 height int 窗口的高度。 表2 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 HwmMainWindowInfo 主窗口信息。 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 /** * 获取主窗口信息 */ void demoGetMainWindowInfoDlg::OnBnClickedOk() { int ret = hwmsdkagent::GetMainWindowInfo(); if (hwmsdk::HWM_COMMON_SUCCESS != ret) { AfxMessageBox(_T("get mainwindow info error")); return; } }
  • getMainWindowInfo 接口描述 该接口用于获取主窗口信息。 方法定义 1 - (HWMUISDKMainWindowInfoModel *)getMainWindowInfo; 参数描述 无 返回值 表1 HWMUISDKMainWindowInfoModel参数说明 参数 类型 描述 x NSInteger 窗口相对于屏幕左侧的偏移量。 y NSInteger 窗口相对于屏幕顶端的偏移量。 width NSInteger 窗口的宽度。 height NSInteger 窗口的高度。 示例代码 1 HWMUISDKMainWindowInfoModel * info = [[HWMBizSdk getBizOpenApi] getMainWindowInfo];
  • JoinConfById 接口描述 该接口用于通过会议ID和密码加入已经存在的会议。 注意事项 在登录和未登录状态下都可以调用该接口。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode JoinConfById(HwmJoinConfByIdInfo *joinConfByIdInfo); 回调函数 1 virtual void OnJoinConfByIdResult(hwmsdk::HwmErrCode ret, const char* reason) {}; 参数描述 表1 结构体HwmJoinConfByIdInfo参数说明 参数 是否必须 类型 描述 confId 是 char[] 会议ID。 password 否 char[] 会议密码。若希望以主持人身份入会,必须传入主持人密码。若希望以来宾身份入会,会议要求来宾密码时,必现传入来宾密码,会议不要求来宾密码时,可以为空字符串。 name 否 char[] 会议昵称。在已登录状态下可为空,已登录时为空将使用登录的用户名作为会场名。匿名入会必须传该名字或者提前设置会场名 isCloseSpk 否 bool 是否关闭扬声器,true关闭扬声器;false不关闭扬声器。 isStopConflictConf 否 bool 强制结束和当前VMR会议资源冲突的会议(必需是vmr资源的拥有者才有权限,否则无效) 返回值 表2 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 通过会议ID加入会议 int demoJoinConfByIdDlg::clickJoinConfById() { // 填写会议ID和会议密码;未登录场景下加入会议时,也可以配置本会场的会场名称 string meetingID = CTools::UNICODE2UTF(CString("989156631")); string accessCode = CTools::UNICODE2UTF(CString("******")); string participantName = CTools::UNICODE2UTF(CString("杭州会场")); hwmsdkagent::HwmJoinConfByIdInfo data; memset(&data, 0, sizeof(hwmsdkagent::HwmJoinConfByIdInfo)); strncpy_s(data.confId, meetingID.c_str(), HWM_MAX_CONF_ID_LEN); strncpy_s(data.password, accessCode.c_str(), HWM_MAX_PASSWORD_LEN); strncpy_s(data.name, participantName.c_str(), HWM_MAX_DISPLAY_NAME_LEN); data.isCloseSpk = false; // 设置麦克风和摄像头开关 int ret = EnableFeature(hwmsdkagent::HWM_ENABLE_FEATURE_TYPE_MIC_SWITCH, true); ret = EnableFeature(hwmsdkagent::HWM_ENABLE_FEATURE_TYPE_CAM_SWITCH, false); ret = hwmsdkagent::JoinConfById(&data); return ret; } 在加入会议前可通过调用EnableFeature修改麦克风、摄像头状态。
  • cancelSubCycleWithParam: 接口描述 该接口用于取消未开始的周期子会议。 注意事项 该接口在登录状态下才能调用。 子会议未开始前可以调用接口,开始后调用则无效。 方法定义 1 - (void)cancelSubCycleWithParam:(HWMSDKCancelSubCycleConfParamModel *_Nonnull)param callback:(_Nonnull HWMSDKCompleteHandler)callback 参数描述 表1 HWMSDKCancelSubCycleConfParamModel参数说明 参数 是否必须 类型 描述 confId 是 NSString * 会议id subConfID 是 NSString * 子会议id endOnlineConf 是 BOOL 是否需要结束在线会议 示例代码 1 2 3 4 5 6 7 8 9 10 11 /// 取消周期子会议 - (void)confirmCancelSubConf { HWMSDKCancelSubCycleConfParamModel *cancelParma = [[HWMSDKCancelSubCycleConfParamModel alloc] init]; cancelParma.confId = confId; cancelParma.subConfID = subConfID; cancelParma.endOnlineConf = YES; [[HWMBizSdk getBizOpenApi] cancelSubCycleWithParam:cancelParma callback:^(NSError * _Nullable error, id _Nullable result) { NSString *tips = !error ? @"取消会议成功" : @"取消会议失败"; [UIUtil showMessage:tips error:error]; }]; }
  • 自定义视频会议来电时接听方式按钮 接口描述 该接口用于自定义视频会议来电时接听按钮。默认情况下视频会议来电时有视频接听和语音接听两种方式,可以通过该接口配置成只显示一种接听方式。 图1 会议来电接听方式按钮自定义 示例代码 1 2 3 4 5 6 7 8 9 10 public class MyUiStrategyWhenConfIncoming implements IUiStrategyWhenConfIncoming { @Override public AnswerBtnShowType getVideoConfIncomingAnswerBtnShowType() { // return AnswerBtnShowType.AnswerBtnShowTypeOnlyVideo; 只显示视频接听按钮 // return AnswerBtnShowType.AnswerBtnShowTypeOnlyAudio; 只显示语音接听按钮 // return AnswerBtnShowType.AnswerBtnShowTypeAll; 语音接听视频接听按钮都显示 return AnswerBtnShowType.AnswerBtnShowTypeAll; } sdkConfig.setUiStrategyWhenConfIncoming(new MyUiStrategyWhenConfIncoming()); 父主题: 界面定制
  • DisableVoicePrompts 接口描述 禁用提示音。 注意事项 该接口非必需调用,如不调用,则默认播放会中提示音。 该接口为同步接口,返回值以错误码形式返回 方法定义 1 SDKERR disableVoicePrompts(VoicePrompts voicePrompts); 参数描述 表1 参数说明 参数 是否必须 类型 描述 voicePrompts 是 VoicePrompts 语音提示信息。 表2 结构体VoicePrompts 参数说明 参数 是否必须 类型 描述 disableMutePrompt 是 boolean 是否禁用静音提示,true表示禁用,false表示不禁用。 返回值 示例代码 1 2 3 4 VoicePrompts voicePrompts = new VoicePrompts(); voicePrompts.setDisableMutePrompt(true); SDKERR result = HWMBizSdk.getBizOpenApi().disableVoicePrompts(voicePrompts); Log.i(TAG, "result code:" + result.getValue() + " desc:" + result.getDescription());
  • GetErrorMessage 接口描述 该接口用于获取错误提示。 注意事项 该接口为同步接口,返回值代表接口是否调用成功。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode GetErrorMessage(int errorCode, OUT HwmErrorMessageInfo *errorMessageInfo); 参数描述 表1 参数说明 参数 类型 描述 errorCode int 错误码。 表2 结构体HwmErrorMessageInfo参数说明 参数 类型 描述 errorMessage char[] 错误提示,注:UTF8编码。 表3 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 HwmErrorMessageInfo 错误提示。 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 /** * 获取错误提示 */ void demoGetErrorMessageDlg::OnBnClickedOk() { hwmsdkagent::HwmErrorMessageInfo info{}; int ret = hwmsdkagent::GetErrorMessage(hwmsdk::HWM_AGENT_ERR_IN_PROCESS, &info); if (hwmsdk::HWM_COMMON_SUCCESS != ret) { AfxMessageBox(_T("get error message error")); return; } }
  • getVideoConfIncomingAnswerBtnShowType 接口描述 该接口用于自定义视频会议来电时接听按钮。默认情况下视频会议来电时有视频接听和语音接听两种方式,可以通过该接口配置成只显示一种接听方式。 图1 会议来电接听方式按钮自定义 注意事项 RTC会议时,禁止语音接通。 方法定义 1 - (HWMAnswerBtnShowType)getVideoConfIncomingAnswerBtnShowType; 参数描述 表1 枚举HWMAnswerBtnShowType说明 参数 描述 HWMAnswerBtnShowTypeAll 全部显示 HWMAnswerBtnShowTypeOnlyAudio 只显示音频接听 HWMAnswerBtnShowTypeOnlyVideo 只显示视频接听 示例代码 1 2 3 4 /// 视频会议来电时按钮显示状态 - (HWMAnswerBtnShowType)getVideoConfIncomingAnswerBtnShowType { return HWMAnswerBtnShowTypeAll; }
  • 示例代码 1 2 3 4 5 6 7 8 /** * 取消会议接口 */ int demoConfListDlg::OnBnCancelConf(hwmsdk::HwmErrCode ret, const char* msg) { string confId = CTools::UNICODE2UTF(CString("989156631")); return hwmsdkagent::CancelConf(confId); } 1 2 3 4 5 6 7 8 9 10 11 /** * 取消会议接口回调 */ void demoCallbackProc::OnCancelConfResult(hwmsdk::HwmErrCode ret, const char* msg) { CString codeStr; codeStr.Format(_T("%d"), ret); string msgStr = CTools::UTF82MultiByte(msg); CString tips = _T("OnCancelConfResult code:") + codeStr + _T(", msg:") + CString(msgStr.c_str()); AfxMessageBox(tips); } OnConfList事件通知跟预约会议场景相同,请参考预约会议的示例代码。
  • 自定义是否开启会议高清优先 在OpenSDKConfig中配置是否开启会议高清优先的功能 开启高清优先后 1.设为开启高清视频后,可以本端发送高清视频 2.设为开启高清视频后,可以选看高清视频 3.不根据手机性能等因素降低发送的分辨率 使用场景 对会议的视频高清程度有要求的场景 注意事项 1.SDK初始化的时候必须传入这个配置sdkConfig才会生效 会前设置是否开启优先传输高清画质,开启后就会忽略网络及手机性能等因素,优先传输高清画质 示例代码 1 2 OpenSDKConfig sdkConfig = new OpenSDKConfig(Context) .setHighResolutionFirst(true) 父主题: 基础配置
  • 参数描述 表1 参数说明 参数 类型 描述 confIncomingInfo HWMSDKConfIncomingInfoModel 会议详情 表2 HWMSDKConfIncomingInfoModel参数说明 参数 类型 描述 subject NSString * 会议标题 confId NSString * 会议ID confMediaType HWMConfMediaType 媒体类型 vmrConfId NSString * vmr会议id 表3 枚举HWMConfMediaType说明 枚举 值 说明 HWMConfMediaTypeAudio 0 音频会议 HWMConfMediaTypeVideo 1 视频会议
  • SetLanguageWithCode 接口描述 该接口用于自定义设置SDK国际化语言。默认是中文。 注意事项 实现自定义语言,要求在 \HwmSdk\sdkResources\language\ 目录下创建对应的国际化文件。如新增阿拉伯语则可以创建 \ar\temp.js,通过该接口设置的语言应与系统当前语言保持一致 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode SetLanguageWithCode(HwmLanguage language, const char* languageCode);
  • 界面配置json说明 会议中的界面,界面上的部分元素是通过config接口进行自定义。可以自定义的界面元素如下: 会议窗口名称(仅针对windows平台) 会议开始后,在Windows任务栏上会生成一个会议的图标,鼠标指向该图标时会显示会议的缩略窗口,该窗口的名称可以自定义。 图1 会议窗口名称 会议信息页面点击复制会议详情的内容 会议链接的域名前缀默认是https://bmeeting.huaweicloud.com/(如https://bmeeting.huaweicloud.com/#/j/982989574),如果入会Portal是第三方自己开发的,会议信息页面点击复制会议详情按钮后,会议详情内容需要用户自定义。 图2 会议信息 会控按钮 删除或者修改SDK中自带的会控按。具体可以删除和修改的按钮见按钮ID定义表。 自定义新增按钮。具体用例见自定义会控按钮。 图3 底部工具栏和更多菜单 图4 共享工具栏和更多菜单 图5 状态工具栏 config接口参数描述 表1 参数说明 参数 是否必须 类型 描述 uiConfig 是 string Json对象字符串"{"frame":object}", object对象有格式要求,若不匹配则配置不生效。详细规则见下表2、表3、表4、表5。 表2 frame对象介绍 key value类型 描述 name string 会议窗口名称。如图1中的窗口名称(MyApp)。 confMenu object 会议窗口上的按钮配置对象。如图3和图4中所示按钮。 表3 confMenu对象介绍 key value类型 描述 toolBar object 会议窗口上的按钮配置对象。如图3和图4中所示按钮。 titleBar object 会议窗口上的标题栏配置对象。如图2中的会议信息。 statusBar object 会议窗口左上角的状态栏配置对象。如图5中的按钮。 表4 toolBar对象子key介绍 key value类型 描述 button object[] 会议窗口上的按钮配置对象。如图3和图4中所示按钮和菜单。 customButton object[] 会议窗口上的第三方自定义按钮配置对象。如图3中的②③和图4中的①②。 表5 statusBar对象子key介绍 key value类型 描述 button object[] 会议窗口左上角的状态栏上的按钮配置对象。如图5中的按钮。 表6 titleBar对象介绍 key value类型 描述 confDetail object[] 如图2中的会议信息 表7 confDetail的对象key介绍 key value类型 描述 button object[] 会议信息窗口上的按钮配置对象。 表8 toolBar对象和confDetai对象中button对象子key介绍 key value类型 描述 buttonId string 按钮的唯一标识。具体buttonId与按钮的对应关系见表9 按钮buttonId介绍。 showAsAction string 是否显示。只有2个取值,“never”:不显示,“ifRoom”:显示。 isCustomizedClick bool 是否点击注入。true:点击注入,用户点击按钮时发送通知消息,SDK不做点击响应处理。 表9 customButton对象子key介绍 key value类型 描述 buttonId string 第三方自定义的按钮id。如“customMenu”。 title string 第三方自定义按钮的显示的名称。如“自定义按钮”。 buttonImg string 第三方自定义按钮的图标路径,使用绝对路径。如“to/path/image.svg”,支持svg/png等格式 注:需要UTF8编码。 buttonPos int 第三方自定义按钮的位置。0:工具栏更多菜单,1:底部工具栏,2:共享工具栏 表10 按钮buttonId介绍 按钮名称 按钮id 说明 麦克风 "microphone" 可隐藏 扬声器 "speaker" 可隐藏 摄像头 "camera" 可隐藏 邀请 "invite" 可隐藏,可注入 离开 "leave" 可隐藏,可注入 共享 "share" 可隐藏,可注入 与会者 "attendee" 可隐藏,可注入 反馈 "feedback" 可隐藏,可注入 标注 "annotation" 可隐藏(仅对win平台生效) 授予远程控制 "remote_control" 可隐藏(仅对win平台生效) 停止共享 "stop_share" 可隐藏 聊天 "chat" 可隐藏,可注入 字幕功能:开启字幕、字幕翻译 "subtitle" 可隐藏 安全 "security" 可隐藏 网络检测 "network_detection" 可隐藏 允许与会者解除静音 "allow_unmute" 可隐藏(仅对win平台生效) 打开/关闭双屏模式 "dual_screen" 可隐藏(仅对win平台生效) 录制 "record" 可隐藏 投票 "vote" 可隐藏 复制会议信息 "copy_conf_info" 可注入 与会者详情 "participant_detail" 可注入(mac无需注入) 复制观众链接 "copy_audience_conf_info" 可注入 按照上面的定义,完整的可定制的界面元素的json格式配置项如下: { "frame": { "name": "demo", "confMenu": { "titleBar": { "confDetail": { "button": [ { "buttonId": "copy_conf_info", "isCustomizedClick": true } ] } }, "statusBar": { "button": [ { "buttonId": "record", "showAsAction": "never" } ] }, "toolBar": { "customButton": [ { "buttonId": "customMenu", "title": "自定义按钮", "buttonPos": 1, "buttonImg": "imagePath", "subMenu": "" }, { "buttonId": "customMore", "title": "自定义更多", "buttonPos": 0, "buttonImg": "imagePath" }, { "buttonId": "customShare", "title": "自定义共享", "buttonPos": 2, "buttonImg": "imagePath" } ], "button": [ { "buttonId": "microphone", "showAsAction": "never" }, { "buttonId": "speaker", "showAsAction": "never" }, { "buttonId": "camera", "showAsAction": "never" }, { "buttonId": "invite", "showAsAction": "never", "isCustomizedClick": true }, { "buttonId": "leave", "showAsAction": "never", "isCustomizedClick": true }, { "buttonId": "attendee", "showAsAction": "never", "isCustomizedClick": true, "dialogPos": "center" }, { "buttonId": "share", "showAsAction": "never", "isCustomizedClick": true }, { "buttonId": "chat", "showAsAction": "never", "isCustomizedClick": true, "dialogPos": "center" }, { "buttonId": "annotation", "showAsAction": "never" }, { "buttonId": "stop_share", "showAsAction": "never" }, { "buttonId": "feedback", "showAsAction": "ifRoom", "isCustomizedClick": true }, { "buttonId": "dual_screen", "showAsAction": "never" }, { "buttonId": "remote_control", "showAsAction": "never" }, { "buttonId": "record", "showAsAction": "never" }, { "buttonId": "subtitle", "showAsAction": "never" }, { "buttonId": "security", "showAsAction": "never" }, { "buttonId": "network_detection", "showAsAction": "never" }, { "buttonId": "vote", "showAsAction": "never" } ] } } } } 由于函数config的uiConfig是string类型,需要把上述的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 /** * UI界面配置 */ async setInvite(){ let param = { "frame": { "confMenu": { "toolBar": { "button": [{ "buttonId": "invite", "showAsAction": "ifRoom", "isCustomizedClick": true }] } } } } const apiService = new ApiService(); // json转换成string传入 let setResult = await apiService.config(JSON.stringify(param)); if(setResult.ret != 0){ window.electron.ipcRenderer.send("show-error-alert", "config error = " + setResult.ret); } } 父主题: 其他说明
  • setShareScreenPermission HWMBizSdk.getBizOpenApi().setShareScreenPermission(boolean hasPermission) 接口描述 该接口用于设置共享权限。 注意事项 该接口返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回 方法定义 1 2 3 4 5 /** * 设置本端是否有共享权限 * @param hasPermission */ void setShareScreenPermission(boolean hasPermission); 参数描述 表1 参数说明 参数 是否必须 类型 描述 hasPermission 是 boolean 是否允许。 返回值 无 示例代码 1 HWMBizSdk.getBizOpenApi().setShareScreenPermission(true);
  • 示例代码 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 /// 创建会议 - (void)creatMeeting { HWMCreateConfParam *param = [[HWMCreateConfParam alloc] init]; param.subject = @"会议标题"; param.confType = HWMConfTypeVideoData; param.needPassword = YES;// 会议是否需要设置密码,默认不需要 param.isCameraOn = YES;// 是否打开摄像头, 默认关闭 param.isMicOn = YES;// 是否打开麦克风, 默认打开 param.isRecordOn = NO;// 是否打开会议录制, 默认关闭 param.joinConfRestrictionType = HWMJoinConfRestrictionAll;// 允许入会范围 // 与会者列表 if (self.selectedMemebrs) { __block NSMutableArray *members = [[NSMutableArray alloc] init]; [self.selectedMemebrs enumerateObjectsUsingBlock:^(HWMContactSelectedModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { HWMCreateConfMember *member = [[HWMCreateConfMember alloc] init]; member.accountId = obj.accountId; member.number = obj.number; member.name = obj.name; member.thirdUserId = obj.thirdUserId; [members addObject:member]; }]; param.members = members; } [[HWMSdk getOpenApi] createConf:param callback:^(NSError * _Nullable error, HWMCreateConfResult * _Nullable result) { [self hideLoading]; if (error) { NSLog(@"创会失败%@", error.localizedDescription); }else{ NSLog(@"创会成功"); } }]; } 与会者列表可以携带与会者创建会议,创建会议成功后服务端会呼叫携带的与会人入会,不需要可以不传。
  • 参数描述 表1 参数说明 参数 是否必须 类型 描述 result 是 int 离会原因 Constants.LEAVE_CONF_MODE.LEAVE_NORMAL = 7; //正常离会 Constants.LEAVE_CONF_MODE.LEAVE_OF_NOSTREAM = 8; //无码流重连后离会 Constants.LEAVE_CONF_MODE.LEAVE_OF_OUTNET = 9; //断网重连后离会 Constants.LEAVE_CONF_MODE.LEAVE_OF_TLS_UNESTABLISH = 10; //tls闪断 Constants.LEAVE_CONF_MODE.LEAVE_OF_OUTNET_TIMEOUT = 14; //断网重连超时离会
  • editCycleConf 接口描述 该接口用于编辑周期会议。 注意事项 该接口在已登录状态下才能调用。 所有字段必填,编辑修改的字段可来源于用户输入,其他不想修改的属性一定要取会议详情对应字段来赋值。 方法定义 1 - (void)editCycleConf:(HWMOrderCycleConfParam *_Nonnull)param callback:(_Nonnull HWMSDKCompleteHandler)callback 参数描述 表1 HWMOrderCycleConfParam参数说明 参数 是否必须 类型 描述 orderConfParam 是 HWMOrderConfParam 普通会议参数 cycleParam 是 HWMSDKCycleConfParamModel 周期会议参数 示例代码 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 /// 编辑周期会议 - (void)editCycleConf{ HWMOrderCycleConfParam * cycleConfParam = [[HWMOrderCycleConfParam alloc] init]; cycleConfParam.orderConfParam.confSubject = @"我的预约会议"; cycleConfParam.orderConfParam.confType = OrderConfTypeVideo; cycleConfParam.orderConfParam.isNeedConfPwd = YES; cycleConfParam.orderConfParam.isAutoRecord = YES; cycleConfParam.orderConfParam.isRecordOn = YES; cycleConfParam.orderConfParam.startTime = 1633017600; //utc时间戳,单位秒,如果获取的时间是本地时间,需要转换成utc时间 cycleConfParam.orderConfParam.duration = 30; //会议持续时长(分钟) cycleConfParam.orderConfParam.timeZone = 56; cycleConfParam.orderConfParam.callInRestrictionType = HWMJoinConfRestrictionAll; HWMAttendeeInfo * attendeeInfo = [[HWMAttendeeInfo alloc] init]; attendeeInfo.name = @"Mike"; attendeeInfo.number = @"+991116003543"; attendeeInfo.isMute = YES; cycleConfParam.orderConfParam.attendee = @[attendeeInfo]; HWMSDKCycleConfParamModel * cycleConfParamModel = [[HWMSDKCycleConfParamModel alloc] init]; cycleConfParamModel.startDate = 1633017600; //utc时间戳,单位秒,如果获取的时间是本地时间,需要转换成utc时间; cycleConfParamModel.endDate = 1636560000; cycleConfParamModel.cycleType = HWMSDKCycleTypeWeek; cycleConfParamModel.preRemindDays = 1; cycleConfParam.cycleParam = cycleConfParamModel; [[HWMBizSdk getBizOpenApi] editCycleConf:cycleConfParam callback:^(NSError * _Nullable error, id _Nullable result) { if (!error) { NSLog(@"book cycle conf success"); [UIUtil showMessage:@"编辑周期会议会议成功"]; }else{ NSLog(@"book cycle conf fail errorCode : %zd",error.code); [UIUtil showMessage:[NSString stringWithFormat:@"编辑周期会议失败:%zd %@", error.code, error.localizedDescription]]; } }]; }
  • getIsInConfOrCall: 接口描述 该接口用于获取用户当前的状态(是否在会议中)。 注意事项 无 方法定义 1 - (HWMSDKConfOrCallStatus)getIsInConfOrCall; 参数描述 表1 参数说明 枚举值 描述 HWMSDKConfOrCallStatusIdle 空闲 HWMSDKConfOrCallStatusInConf 会议中 HWMSDKConfOrCallStatusInCall 通话中 返回值 无 示例代码 1 [[HWMBizSdk getBizOpenApi] getIsInConfOrCall];
  • 注意事项,使用通知前请查看 需要使用通知方法时,必须注册代理对象。 两种方式: 初始化时,对HWMOpenSDKConfig对象的属性赋值 1 2 3 HWMOpenSDKConfig *config = [[HWMOpenSDKConfig alloc] init]; //示例根据需求使用对应代理 config.globalHandler = [NotifyMessageHandler sharedInstance]; 使用前使用[HWMSdk getSdkConfig]获取初始化对象给属性赋值 1 2 //示例根据需求使用对应代理 [HWMSdk getSdkConfig].globalHandler = [NotifyMessageHandler sharedInstance]; 代理方法必须写在代理对象中 使用代理时保证代理对象存在 父主题: 通知参考
  • 参数描述 表1 参数说明 参数 类型 描述 updateType HwmConflistUpdateType 更新类型。 confInfoList HwmConfListInfo* 会议列表参数信息。 confInfoLen unsigned int 会议列表参数信息的长度。 表2 枚举HwmConflistUpdateType说明 枚举值 描述 CONFLIST_UPDTAE_ALL 会议列表全量更新。 CONFLIST_UPDATE_ADD 会议列表有增加或者修改。编辑会议导致会议列表变更会上报该值。 CONFLIST_UPDATE_DELETE 会议列表有删除。 表3 结构体HwmConfListInfo参数说明 参数 类型 描述 confId char[] 会议ID。 confSubject char[] 会议主题。 chairmanPwd char[] 主持人密码。 guestPwd char[] 来宾密码。 audiencePwd char[] 观众密码。 startTime long long 会议开始时间(utc时间) ,单位秒。 endTime long long 会议结束时间(utc时间) ,单位秒。 timeZone char[] 时区码 mediaType HwmMediaType 媒体类型 表2。 scheduserName char[] 会议预定者名称。 vmrConferenceId char[] 用于云会议显示的ID。 chairJoinUri char[] 主持人加入会议uri链接 guestJoinUri char[] 来宾加入会议uri链接 audienceJoinUri char[] 观众加入会议的链接 confStateType HwmConfState 会议状态 isWebinar bool 是否是网络研讨会 selfConfRole HwmConfRole 本人在会议中的角色表5。 customInfo char[] 自定义扩展信息 表4 枚举HwmConfState说明 枚举值 描述 HWM_CONF_STATE_SCHEDULE 预定状态。 HWM_CONF_STATE_CREATING 正在创建状态。 HWM_CONF_STATE_GOING 会议已经开始。 HWM_CONF_STATE_DESTROYED 会议已经关闭
  • 录制会议权限更新 接口描述 收到该通知时,表示是否有录制会议权限。 方法定义 1 2 3 4 5 6 /** * 录制会议权限更新通知 * * @param hasPermission */ void onRecordPermissionChanged(boolean hasPermission); 参数描述 表1 参数说明 参数 类型 描述 hasPermission boolean 是否有录制会议权限 返回值 无。 父主题: 业务消息通知
  • SetUserSavePath 接口描述 该接口用于设置用户文件(包括本地录制文件)的保存路径。 注意事项 该接口非必需调用,若不设置,则使用默认路径。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode SetUserSavePath(HWMSavePathType type, const char* path);
  • 示例代码 1 2 3 4 5 6 7 8 /// 初始化 HWMOpenSDKConfig *config = [[HWMOpenSDKConfig alloc] init]; config.appId = getAppId();// 传入申请到的企业AppId config.appGroupIndentifier = getAppGroupIndentifier();//必须, 屏幕共享 extension的appGroup。用于屏幕共享时,共享进程和主进程通信,详情可参考苹果官方Extension相关文档 BOOL result = [HWMSdk initWithConfig:config]; if (result) { NSLog(@"初始化成功"); } 典型场景和接口参考中的示例代码仅作为示例用的伪代码,不能直接使用。
  • 参数描述 表1 结构体HwmConfIncomingInfo参数说明 参数 类型 描述 state HwmConfComingState 来电状态 mediaType HwmMediaType 会议媒体类型。 confId char[] 会议id。 vmrId char[] VMR会议id。 表2 枚举HwmConfComingState说明 枚举值 描述 HWM_CONF_COMING_STATE_START 初始状态,来电振铃中。 HWM_CONF_COMING_STATE_ACCEPT 接听状态,已接听来电。 HWM_CONF_COMING_STATE_REJECT 拒绝状态,已拒绝来电。 HWM_CONF_COMING_STATE_TIMEOUT 未响应状态,呼叫超时或者主叫已挂断。 表3 枚举HwmMediaType说明 枚举值 描述 HWM_MEDIA_TYPE_AUDIO 音频。 HWM_MEDIA_TYPE_VIDEO 视频。
共100000条