通过阅读本文,您可以了解到云会议SDK的配置和使用说明。
前提条件
已集成云会议SDK。
使用流程
入会交互流程
操作步骤
- 应用启动时进行初始化。
//用于监控应用生命周期,后续可以正常显示悬浮窗。 AliMeetingUIManager.initManager(app:Application)
- 进入会议前进行全局初始化。
- UT埋点初始化。
AliMeetingUIManager.pageTracker = object: IAMUIPageTrackerAdapter{ }
- UI配置初始化。
- 静态资源替换
- Activity样式定制
请在app中覆盖style AliMeetingLight.MeetingDetail
- 定制指定图片资源
定制图片类别 需要覆盖的资源 屏幕共享用户小窗头像 ic_cloud_meeting_screen_share_default_avatar.png 会议室默认小窗头像 ic_cloud_meeting_room_default_avatar.png 用户默认头像 ic_cloud_meeting_user_default_avator.png 说明 定制的图片需要覆盖drawable-hdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi四种规格。
- Activity样式定制
- 用户交互控制
AliMeetingUIManager.uiController = object : AliMeetingUIManager.IAMUIMeetingUIController()
可定制内容:悬浮框显示位置、悬浮框显示样式、邀请人、会议详情、会议评价页面跳转、是否显示个人详情页、头像显示、反馈入口等。具体实现请参见AlimeetingUIManager.IAMUIMeetingUIController,如下所示:
abstract class IAMUIMeetingUIController { /** * 获取悬浮窗距离屏幕边缘的距离,默认为上下留出状态栏与底部虚拟按键的距离 */ @MainThread open fun getFloatingEdgeInsets(floatingType: AMUIFloatingType): AMUIEdgeInsets /** * 获取悬浮框显示信息,包括大小、圆角半径、默认显示位置 */ @MainThread open fun getFloatingViewShowConfig(context: Context, floatingType: AMUIFloatingType): AMUIFloatingShowConfig /** * 创建悬浮框实例,移动逻辑内部统一处理 */ open fun createFloatingView(context: Context): IAMUIFloatingLayout /** * 会中点击邀请人操作,接入方在外部自己处理邀请逻辑 * 返回false 表示外部未处理,将显示默认UI */ @MainThread open fun onInviteAction( view: View, activity: FragmentActivity, detail: AMUIMeetingDetail? ): Boolean /** * 会中点击会议标题,显示会议信息信息 * 返回false 表示外部未处理,将显示默认UI */ @MainThread open fun showMeetingDetail( view: View, activity: FragmentActivity, detail: AMUIMeetingDetail? ): Boolean /** * 加载人员头像, * view 默认类型为 ImageView,用户可以自定义View进行处理,通过替换布局文件 layout_meeting_avatar 来进行 * 返回false 表示外部未处理,将显示默认UI */ @MainThread open fun loadAvatar( view: AMUIAvatarLayout, url: String?, client: AMSDKMeetingClient, userName: String? ): Boolean /** * 聊天页面回调,chatPermissionGranted 表示当前会议是否有聊天权限 * 返回false 表示外部未处理,将显示默认UI */ open fun loadMeetingChat( view: View, activity: FragmentActivity, chatPermissionGranted: Boolean ): Boolean /** * 获取人员列表显示控制器,可以控制人员列表显示 */ open fun getMemberListController(): IAMUIMemberListController? open fun showClientProfile(client: AMSDKMeetingClient) /** * maxOnlineClients 当前入会端在线期间,会中最大在线人数 */ open fun startRateMeeting(meetingUuid: String, memberUuid: String, rateLink: String?, maxOnlineClients: Int): Boolean = false /** 用户手动改变是否结束后进入会议 * **/ open fun onRateMeetingConfigChanged(enableRateMeeting: Boolean) /** * 当前client 是否有详情信息,如果有,则在个人页面里面显示详情信息入口,否则隐藏入口 */ open fun hasClientProfileDetail(client: AMSDKMeetingClient): Boolean = false /** 用户打开我要反馈入口 **/ open fun openFeedBack(meetingUuid: String, memberUuid: String, feedBackUrl: String): Boolean = false }
- 静态资源替换
- UI高级配置专项初始化。
- 未入会成员操作配置。
通过实现
IAMUIMeetingUIController.getMemberListController()
接口,提供自定义成员管理控制,实现未入会成员的呼叫功能,具体实现如下所示:AliMeetingUIManager.uiController = DemoUIController() private class DemoUIController : AliMeetingUIManager.IAMUIMeetingUIController() { override fun getMemberListController(): IAMUIMemberListController? { return DemoMemberListController() } } private class DemoMemberListController : IAMUIMemberListController() { companion object { private const val MENU_CALL_CLIENT = 11 } private val offlineListener = object : IAMUIClientClickListener { override fun onClientClicked(view: View, client: AMSDKMeetingClient) { //自定义展示逻辑,可以利用UISDK的组件进行实现 val menuItems = arrayListOf<AMUIOperateMenu>() menuItems.add( AMUIOperateMenu( MENU_CALL_CLIENT, view.context.getString(R.string.cloud_meeting_member_menu_call_him), ContextCompat.getColor( view.context, R.color.cloud_meeting_operate_menu_high_light ), AMUIOperateMenuType.TYPE_TEXT ) ) AMUIMemberOperateMenuFragment().setData(client, menuItems) .setClickListener(object : IAMUIClientMenuClickListener { override fun onClientMenuClicked( view: View, client: AMSDKMeetingClient, menu: AMUIOperateMenu, newConfigValue: Boolean ) { if (menu.menuId == MENU_CALL_CLIENT){ //开始自定义的呼叫动作 } } }) .safeShow(activity, "operate_dialog") } } override fun bindOfflineClient( context: Context, viewHolder: RecyclerView.ViewHolder, client: AMSDKMeetingClient, showOfflineAction: Boolean, listener: IAMUIClientClickListener? ) { super.bindOfflineClient(context, viewHolder, client, true, offlineListener) } }
- 自定义头像组件。
UI SDK可以自定义头像加载组件,具体方式为覆盖layout_cloud_meeting_avatar.xml布局文件,确保
android:id="@+id/avatarView"
,然后设置AliMeetingUIManager.uiController,实现IAMUIMeetingUIController.loadAvatar()接口,具体实现如下所示:private class DemoUIController : AliMeetingUIManager.IAMUIMeetingUIController() { override fun loadAvatar( view: AMUIAvatarLayout, url: String?, client: AMSDKMeetingClient, userName: String? ): Boolean { val customView = view.contentView() //获取到 R.id.avatarView 对应的View 对象 //实现自己的头像加载逻辑 //注意返回值为true,否则将进入默认加载头像的逻辑 return true } }
- 配置悬浮框在应用外展示。
AliMeetingUIManager.uiController = object : AliMeetingUIManager.IAMUIMeetingUIController() { override fun createFloatingView(context: Context): IAMUIFloatingLayout { //关键!!!,这里在创建好IAMUIFloatingLayout后,设置默认允许在应用外显示,用户也可以实现自己的IAMUIFloatingLayout return AMUIVideoFloatingLayout(context).setFloatingOutSide(true) } }
注意 目前默认悬浮框不在应用外展示,悬浮框显示时,单击悬浮框会跳转到会中页面,同时悬浮框消失;如果悬浮框在应用外展示,由于现在很多终端限制唤起后台应用,单击悬浮框后可能会无法跳转到会中页面,然后悬浮框消失,给用户带来不好体验。
- 未入会成员操作配置。
- UT埋点初始化。
- 获取入会信息。
向自己的服务请求入会信息,获取入会的必要信息。
data class AMUIMeetingDetailConfig( val meetingAppId: String = "", //必填 val meetingToken: String = "", //必填 val meetingDomain: String = "",//必填 val meetingCode: String = "",//必填 val meetingUUID: String = "",//必填 val memberUUID: String = "",//必填 )
- 构建入会配置。
通过
AliMeetingJoinConfig.Builder
构建入会信息,示例代码如下所示:- Java代码
public void joinMeeting(Context context, String meetingCode, String userId, String userName, MeetingInfo meetingInfo, String appTag, int appNotifyRes, boolean openBeautifyDefault, boolean closeCameraDefault, boolean muteAudioDefault, AMUIMeetingDetail detail) { AMUIMeetingJoinConfig.Builder builder = new AMUIMeetingJoinConfig.Builder() .setMeetingCode(meetingCode) .setUserId(userId) .setUserName(userName) .setMeetingDetailConfig( new AMUIMeetingDetailConfig( meetingInfo.clientAppId, meetingInfo.meetingToken, meetingInfo.meetingDomain, meetingInfo.meetingCode, meetingInfo.meetingUUID, meetingInfo.memberUUID, meetingInfo.slsInfo ) ) .setOpenBeautifyDefault(openBeautifyDefault) .setAppIdentifier(appTag) .setAppVersion(getShortVersionName()) .setAppNotifyIconRes(appNotifyRes) .setOpenCameraDefault(!closeCameraDefault) .setMuteAudioDefault(muteAudioDefault) .setMeetingDetail(detail); AliMeetingUIManager.joinMeeting(context, builder.builder()); }
- Kotlin代码
val builder = AMUIMeetingJoinConfig.Builder() .setMeetingCode(meetingInfo.meetingCode) .setUserId(userId) .setUserName(userName) .setMeetingDetailConfig( AMUIMeetingDetailConfig( meetingInfo.clientAppId, meetingInfo.meetingToken, meetingInfo.meetingDomain, meetingInfo.meetingCode, meetingInfo.meetingUUID, meetingInfo.memberUUID ) ) .setOpenBeautifyDefault(openBeautifyDefault) .setAppIdentifier(appTag) .setAppVersion(Platform.getShortVersionName()) .setAppNotifyIconRes(appRes) .setOpenCameraDefault(!closeCameraDefault) .setMuteAudioDefault(muteAudioDefault) .setMeetingDetail(detail)
具体配置说明如下所示:
- 必须配置
配置变量 最低支持版本 说明 appNameRes 1.0.1.6 应用名字符串资源,状态栏消息会显示。 appNotifyIconRes 1.0.1.6 应用图标,状态栏消息会显示。 userId 1.0.0.0 用户ID。 meetingCode 1.0.0.0 会议口令。 meetingDetailConfig 1.0.0.0 入会配置信息,包含入会域、Token、sls等信息。 - 可选配置
配置变量 最低支持版本 说明 openCameraDefault 1.0.0.0 是否默认开启本地摄像头,默认为开启。 muteAudioDefault 1.0.0.0 是否默认关闭麦克风,默认为不关闭。 openSpeakerDefault 1.0.0.0 是否默认开启扬声器,默认为开启。 openBeautifyDefault 1.0.1.6 是否默认开启美颜,默认为开启。 enableVideo 1.0.0.0 当前会议是否支持视频,默认为支持,设置为false为不支持,即变成音频会议。 enableSaveTrafficMode 1.1.0.0 入会时是否默认开启省流量模式,如果开启,则openCameraDefault参数不生效,即自动关闭摄像头。默认不开启省流量模式。 loadingFinishShowDelayMills 1.0.1.8 进入会议时,loading页面上面的结束会议按钮显示延时时间,默认为0,小于或等于0时结束会议按钮不延迟显示。 canHostUnMuteClientDirectly 1.1.0.0 主持人是否可以直接取消他人静音状态,默认为不可以。 onlyHostCanMuteAudio 1.0.0.0 是否只允许发起人静音他人。仅在非主持人会议模式下生效,默认为 false,即所有人都可以进行静音他人操作;设置为true则表示只有发起人可以进行静音他人操作。 onlyHostCanHangUpClient 1.0.0.0 是否只允许发起人挂断他人。仅在非主持人模式下生效,默认为 false,即表示所有人都可以进行挂断他人操作;设置为true则表示只有发起人可以进行挂断他人。 meetingDetail 1.0.0.0 会议详情,在会中显示会议信息,邀请人入会时使用。 meetingCallBack 1.0.0.0 会议关键事件回调,包括用户主动离会、会议结束、用户状态改变等事件,请参见配置会议关键状态回调。 actionPlugins 1.1.0.0 更多操作里面的扩展功能,可以添加自己的实现,如果要替换默认的扩展项,可以配合 disableDefaultActionPlugin
函数使用。feedBackUrl 1.1.0.0 在更多弹框中,是否显示用户反馈入口,如果 feedBackUrl
不为空,则显示反馈入口。enableManualDisableRateMeeting 1.1.0.0 是否允许手动关闭弹出评分页面,默认为true,当 meetingDetail#rateLink
传空时,该参数无效。用户修改配置后,会触发回调IAMUIMeetingUIController#onRateMeetingConfigChanged
。allowsParticipantActionWithoutHost 1.2.0.1 主持人会议中,在主持人未入会,并且设置了不允许开启摄像头或者麦克风之后,非主持人入会是否限制其音视频初始状态,是否允许其开启摄像头、麦克风等操作。
- Java代码
- 配置日志输出。
UI SDK默认仅在Debug包中输出日志到Console,您可以自定义会中日志输出,在发布包中将日志保存至文件里,方便后续问题排查。如果线上需要收集日志,可以设置AMUILoggerLevel为AMUILoggerLevel.INFO(防止日志过大)。
AMUIMeetingJoinConfig.Builder#setLoggerLevel(AMUILoggerLevel.INFO, SDKDemoLogger())
SDKDemoLogger的定义如下所示:
private class SDKDemoLogger : AMUILoggerPrinter { override fun printInfo(tag: String, msg: String) { //开发者自定义日志输出,可以输出到文件保存 Log.d(tag, msg) } override fun printDebug(tag: String, msg: String) { //开发者自定义日志输出,可以输出到文件保存 Log.d(tag, msg) } override fun printWarn(tag: String, msg: String) { //开发者自定义日志输出,可以输出到文件保存 Log.w(tag, msg) } override fun printError(tag: String, msg: String, throwable: Throwable?) { //开发者自定义日志输出,可以输出到文件保存 Log.e(tag, msg, throwable) } override fun onMeetingKeyEvent( progress: String, isStart: Boolean, time: Long, result: Boolean, extra:String? ) { //入会过程关键步骤输出 Log.e("DemoMeeting", "onMeetingKeyEvent $progress isStart:$isStart time:$time $result") } }
- 配置会议关键状态回调。
UI SDK提供了会议关键状态回调进行监控,主要包括以下两个方面:
- 入会关键流程回调
通过实现步骤 5中的
AMUILoggerPrinter#onMeetingKeyEvent
接口进行监听。 - 人员状态、会议状态关键流程回调
通过
AMUIMeetingJoinConfig.Builder#setMeetingCallBack(callBack: AMUIMeetingCallBack)
进行监听,示例代码如下所示:abstract class AMUIMeetingCallBack { /** * 加入会议成功之后,用户状态变化 */ open fun onClientStatusChanged( client: AMSDKMeetingClient, event: AMUIClientStatusEvent ) { } /** * 用户主动离开会议,会同时触发 onMeetingFinished 回调 */ open fun onUserLeaveMeeting() { } /** * 用户主动结束会议,会同时触发 onMeetingFinished 回调 */ open fun onUserFinishMeeting() { } /** * 加入会议成功 */ abstract fun onMeetingJoined() /** * 加入会议成功后,会议中断或正常挂断 */ abstract fun onMeetingFinished(code: AMUIFinishCode, msg: String?) /** * 加入会议未成功之前,加入异常 */ abstract fun onJoinMeetingError(code: AMUIErrorCode, msg: String?) }
- 入会关键流程回调
- 加入会议。
调用AliMeetingUIManager#joinMeeting(context: Context, config: AMUIMeetingJoinConfig)
加入会议。