通过阅读本文,您可以了解到云会议SDK的配置和使用说明。

前提条件

已集成云会议SDK。

使用流程

入会交互流程

001

操作步骤

  1. 应用启动时进行初始化。
    //用于监控应用生命周期,后续可以正常显示悬浮窗。
    AliMeetingUIManager.initManager(app:Application)
  2. 进入会议前进行全局初始化。
    1. UT埋点初始化。
      AliMeetingUIManager.pageTracker = object: IAMUIPageTrackerAdapter{
      }
    2. 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四种规格。
      • 用户交互控制
        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
            }
    3. UI高级配置专项初始化。
      1. 未入会成员操作配置。

        通过实现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)
                }
            }
      2. 自定义头像组件。

        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
                }
            }
      3. 配置悬浮框在应用外展示。
        AliMeetingUIManager.uiController = object : AliMeetingUIManager.IAMUIMeetingUIController() {
                    
             override fun createFloatingView(context: Context): IAMUIFloatingLayout {
                 //关键!!!,这里在创建好IAMUIFloatingLayout后,设置默认允许在应用外显示,用户也可以实现自己的IAMUIFloatingLayout
             return AMUIVideoFloatingLayout(context).setFloatingOutSide(true)
             }
        }
        注意 目前默认悬浮框不在应用外展示,悬浮框显示时,单击悬浮框会跳转到会中页面,同时悬浮框消失;如果悬浮框在应用外展示,由于现在很多终端限制唤起后台应用,单击悬浮框后可能会无法跳转到会中页面,然后悬浮框消失,给用户带来不好体验。
  3. 获取入会信息。

    向自己的服务请求入会信息,获取入会的必要信息。

    data class AMUIMeetingDetailConfig(
        val meetingAppId: String = "", //必填
        val meetingToken: String = "", //必填
        val meetingDomain: String = "",//必填
        val meetingCode: String = "",//必填
        val meetingUUID: String = "",//必填
        val memberUUID: String = "",//必填
    )
  4. 构建入会配置。

    通过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 主持人会议中,在主持人未入会,并且设置了不允许开启摄像头或者麦克风之后,非主持人入会是否限制其音视频初始状态,是否允许其开启摄像头、麦克风等操作。
  5. 配置日志输出。

    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")
        }
    }
  6. 配置会议关键状态回调。

    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?)
      }
  7. 加入会议。

    调用AliMeetingUIManager#joinMeeting(context: Context, config: AMUIMeetingJoinConfig)加入会议。