Android MeetingSDK集成手册

Android SDK使用kotlin进行开发,所有对外暴露接口都在com.aliwork.meeting.api,如有其它包含下面的API调用,则可以认为是不规范调用。

1 基本使用流程

  1. 用户通过meetingUUID、memberUUID发起入会请求。

  2. 入会成功,通知用户入会人员,开启会议。

  3. 针对人员进行会控操作。

  4. 结束会议。

2 集成Android端

2.1 Android依赖及环境配置

Android SDK使用kotlin进行开发,所有对外暴露接口都在com.aliwork.meeting.api,如有其它包含下面的API调用,则可以认为是不规范调用。

2.1.1 kotlin编译环境添加

  1. 在应用最外层的build.gradle文件中添加kotlin支持

         dependencies {
             classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31"
    //其它配置
    }
  2. 在对应modue中添加kotlin支持,首先引入kotlin的plugin

    apply plugin:'kotlin-android'
    apply plugin:'kotlin-android-extensions'
  3. 在依赖中添加kotlin语法支持

    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$leatestversion"

2.2 下载AliMeetingSDK并集成

2.2.1 下载AndroidSDK

下载Android三个aar包放入到Android Studio对应的目录中,同时在gradle中添加依赖配置。

mediasdk-1.0.0.2-20191204-12345203.aar

meetingsdk-api-1.0.0.6-20200227-12711407.aar

meetingsdk-impl-1.0.0.6-20200227-12711407.aar

Android Studio 目录结构

gradle配置

implementation fileTree(dir:'libs', include:['*.aar'])

ABI 配置(gradle有多种配置方式,这里这用一种,如果工程中已有类似配置的可以忽略)

android {
...
  defaultConfig {
...
   ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
      abiFilters 'armeabi','armeabi-v7a'
}
}
}

添加其他依赖

implementation "com.android.support:support-annotations:27.1.1"
implementation "com.android.support:appcompat-v7:27.1.1"
api "io.reactivex.rxjava2:rxandroid:2.0.2"
api "io.reactivex.rxjava2:rxjava:2.1.14"
api 'com.alibaba:fastjson:1.1.73.android'
//okhttp:3.14.1 支持Android 5.0+,如果需要支持Android 4.0+,可以使用3.10.0版本
implementation "com.squareup.okhttp3:okhttp:3.14.1"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.31"

proguard 配置 AliMeetingSDK proguard 已经在内部集成,用户不需要额外配置proguard规则

2.2.2 构建入会配置

入会信息配置

AMSDKMeetingConfig.Builder builder =newAMSDKMeetingConfig.Builder(context, meetingId)
.setMemberUuid(memberUuid)
.setEglBase(eglBase)
//通过checkMeetingCode接口的clientAppId参数获取
.setAppId(clientAppId)
.setMeetingToken(meetingToken)
.setMeetingDomain(meetingDomain)
.build();

2.2.3 发起会议

publicvoid startMeeting(IAMSDKMeetingConfig config,AMSDKMeetingCallBack callback){
//注意 AMSDKMeetingManager 用于管理一次会议,AMSDKMeetingManager.create() 用于新建一个AMSDKMeetingManager实例, 一次会议中不能创建多次AMSDKMeetingManager实例进行管理,否则状态会不正确
AMSDKMeetingManager meetingManager =AMSDKMeetingManager.create()
    meetingManager.joinMeeting(config, callback)
}

2.2.4 在回调中监听会议状态

在AMSDKMeetingCallBack 包含了会议状态的回调,各个方法的含义为:

interfaceAMSDKMeetingCallBack{
/**
     * 已成功进入会议
     */
    fun onMeetingJoined()

/**
     * event == AMSDKClientListEvent.EVENT_INIT  入会时列表初始化事件,返回会议中所有人员信息,包括已入会和未入会人员信息
     * event == AMSDKClientListEvent.EVENT_ADD  会中添加人员消息,返回添加的所有人员信息
     * event == AMSDKClientListEvent.EVENT_REMOVE  会中踢出人员消息,返回踢出的所有人员信息
     */
    fun onClientListChange(list:List<AMSDKMeetingClient>, event:AMSDKClientListEvent)

/**
     * 会中成员状态发生变化
     */
    fun onClientStatusChange(client:AMSDKMeetingClient, event:AMSDKStatusEvent)
/**
     * 媒体流状态改变:
     * client.isPublisher == true 时,一般为带宽较低,服务端建议主动断流,需要用户手动断流;
     * client 为其他人时,一般为服务端不给端发送对应client的流了,收到该回调时视频状态已经发生改变
     * */
    fun onStreamStatusChange(client:AMSDKMeetingClient, streamActive:Boolean)

/**
     * 出现啸叫回调,目前只有啸叫产生时会通过该函数回调,但是啸叫消失时不会有回调
     */
    fun onWhistlingNoiseStatusChange(){

}

/**
     * 通道连接状态回调,用于通知用户重连,在重连过程中可能会收到多个 AMSDKConnectStatus.STATUS_RECONNECTING 消息
     */
    fun onMeetingStatusChange(status:AMSDKMeetingStatus){

}
/**
     * 会议正常结束
     */
    fun onMeetingFinish(code:AMSDKFinishCode, reason:String?)

/**
     * 会议中收到消息,目前还未实现
     */
    fun onChannelMessage(msg:String)

/**
     * 入会异常
     */
    fun onError(code:AMSDKErrorCode, reason:String?)
}
enumAMSDKStatusEvent{
/**
     * 0 -- 用户上线/下线消息
     */
    STATUS_ONLINE,
/**
     * 1 -- 视频状态发生变化,可以通过client.isVideoOn 进一步判断
     */
    STATUS_VIDEO,
/**
     * 2 -- 音频状态发生变化,可以通过client.isAudioOn 进一步判断
     */
    STATUS_AUDIO,
/**
     * 3 -- 说话状态发生变化,可以通过client.isTalking  进一步判断
     */
    STATUS_TALKING,
/**
     * 4 -- 震铃状态发生变化,可以通过client.isRing进一步判断
     */
    STATUS_STATUS_RINGING,
/**
     * 5 -- 网络状态发生变化,可以通过client.isNetworkWeak 和client.getNetworkQuality 进一步获取网络状态
     */
    STATUS_NETWORK_QUALITY,
/**
     * 6 -- 主讲人发生变化,可以通过client.isMainSpeaker进一步获取是否是主讲人
     */
    STATUS_MAIN_SPEAKER,
/**
     * 7 -- 流状态发生改变,可以通过client.isStreamReady 进行判断
     */
    STATUS_STREAM_READY
}

2.2.5 用户画面渲染

SDK 将分享流、入会用户、会议室等统一封装成AMSDKMeetingClient 对象,该类实例不能外部创建,仅支持内部生成。

用户可以使用封装好的AMSDKTextureRenderView 或者 AMSDKSurfaceRenderView 对用户视频流进行渲染,两者的具有公共父类AMSDKVideoCanvas, 区别同Android 的 TextureView 与SurfaceView。

在渲染之前,需要创建AMSDKEglBase 实例,推荐全局使用同一个AMSDKEglBase 实例进行渲染,因此在2.3.1 构建入会配置中设置的AMSDKMeetingConfig 中传入的AMSDKEglBase 实例最好初始化AMSDKVideoCanvas 时传入的示例保持一致。

在进行渲染之前,建议先通过AMSDKMeetingClient 判断当前实例是否视频可用,然后再将AMSDKVideoCanvas 通过client.addRenderView 传入client进行渲染,在渲染结束或者View 销毁时,需要用户主动调用client.removeRenderView 解除渲染关系

AMSDKVideoCanvas渲染目前支持三种缩放方式,通过AMSDKScalingType 进行控制。

enumAMSDKScalingType{
/**
     * 将视频按照渲染区域大小进行适配,可能存在黑边
     */
    SCALE_ASPECT_FIT,
/**
     * 根据渲染区域大小,将视频流进行拉伸,填充到整个渲染区域
     */
    SCALE_ASPECT_FILL,
/**
     * 根据渲染区域大小,截取视频流中央关键部分进行展示
     */
    SCALE_ASPECT_BALANCED
}

2.2.6 会议控制

会议控制通过AMSDKMeetingClient 进行

/**
     * 对用户静音/取消静音,静音后对应Client不在发送音频数据,静音后用户新的状态将通过
     * AMSDKMeetingCallBack#onClientStatusChange 进行更新
     * @param mute mute == true, 静音, mute == false 取消静音
     */
    fun muteAudio(mute:Boolean, callback:AMSDKActionCallBack?)
/**
     * 对用户关闭/开启视频,mute操作后,对应Client不再发送视频数据,mute后用户新的状态将通过
     * AMSDKMeetingCallBack#onClientStatusChange 进行更新
     * @param mute mute == true, 关闭视频, mute == false 打开视频
     */
    fun muteVideo(mute:Boolean, callback:AMSDKActionCallBack?)
/**
     * 拨打对应电话号码,当前对外不支持
     */
    fun call(phoneName:String, callback:AMSDKActionCallBack?)
/**
     * 挂断对应用户,对自己不生效
     */
    fun hangup(callback:AMSDKActionCallBack?)

对于设备相关的控制,通过AMSDKDeviceManager 进行控制

2.2.7 结束会议

通过AMSDKMeetingManager中的leaveMeeting 或者finishMeeting进行操作,leaveMeeting 表示自己离开会议,finishMeeting在自己离开会议的同时,还会将当前会议中其他正在会议中的其他人员结束会议。

3 Demo下载

AliMeetingSDK_Demo_Android-master20191216.zip

注意:运行demo时,请将Demo中 app/src/main/assets/env.json 配置文件中的参数替换真实会议参数

SDK 更新日志

1.0.0.6(2020-02-27)

mediasdk-1.0.0.2-20191204-12345203.aar

meetingsdk-api-1.0.0.6-20200227-12711407.aar

meetingsdk-impl-1.0.0.6-20200227-12711407.aar

【修复】修复是否自动视频音频输出配置默认值,保存音频输出通道被抢占时的输出通道,在取消抢占时恢复为之前的状态

【修复】音频入会时摄像头默认状态

【修复】静音他人时本地音频状态不正确

1.0.0.5(2020-02-24)

mediasdk-1.0.0.2-20191204-12345203.aar

meetingsdk-api-1.0.0.5-20200224-12693180.aar

meetingsdk-impl-1.0.0.5-20200224-12693180.aar

【添加】添加远程视频流状态接口

【修复】调整离会后再打印client日志时可能出现的crash

【修复】SDK 弱网及静音日志调整

1.0.0.4(2020-01-17)

mediasdk-1.0.0.2-20191204-12345203.aar

meetingsdk-api-1.0.0.3-20191210-12365514.aar

[meetingsdk-impl-1.0.0.3-20191210-12365514.aar

【修复】部分手机息屏之后再解锁后,publisher isVideoOn状态异常

【修复】publisher在收到ONLINE消息之前收到了STREAM_READY消息

1.0.0.3(2019-12-10)

mediasdk-1.0.0.2-20191204-12345203.aar

meetingsdk-api-1.0.0.3-20191210-12365514.aar

[meetingsdk-impl-1.0.0.3-20191210-12365514.aar

【修复】断网重连过程中本地音视频操作状态在重连成功后没有同步到其他端

1.0.0.2(2019-12-04)

mediasdk-1.0.0.2-20191204-12345203.aar

meetingsdk-api-1.0.0.2-20191204-12345212.aar

meetingsdk-impl-1.0.0.2-20191204-12345212.aar

【修复】断网重连时可能出现Sid为空问题

【修复】SLS日志中含有空格问题,日志中sid不准确问题

【修复】音频会议中不再强制需要相机权限

【修复】取消音频会议中内部视频操作

1.0.0.1(2019-11-28)

mediasdk-1.0.0.1-20191128-12317238.aar

meetingsdk-api_1.0.0.1-20191128-12317251.aar

meetingsdk-impl_1.0.0.1-20191128-12317251.aar

【修复】媒体信令sid安全问题