快速开始

前提条件

  • Android X架构(不支持旧Android Support架构,Google官方已不再维护)。
  • Android targetSdk最高为33。
  • Android Sdk版本最低为21。
  • Android Studio版本最低为3.0。
  • SDK采用今日头条UI适配方案,会更改UI表现效果。如无需适配,可在Activity中实现CancelAdapt接口,即可跳过当前页适配,建议统一在baseActivity中进行相应配置。
  • 如果网络环境有部署防火墙,请根据应用企业防火墙限制打开对应端口,避免无法正常访问全时云会议相关服务。

运行Demo

  1. 下载云会议Android端SDK压缩包,下载完成后解压缩即可。
  2. 将示例项目导入Android Studio中,编译和运行项目。
  3. 配置入会时所需信息,至此就可以体验示例demo了。

集成SDK

创建工程

导入文件

下载解压云会议SDK的压缩包以后,将/libs目录下的所有aar拷贝到您的项目中。

SDK中的aar说明(编译时动态选择库范围,表格中的版本号请忽略,以实际下载的SDK包中的aar文件为准):

文件名 说明 必选
base-1.0.8.aar
common-1.1.35.aar
danmaku-1.0.0.aar
dsbridge-1.0.7.aar
emoiji-1.0.2.aar
skin-1.0.2.aar
fs-1.0.3.aar
pictureselector-v2.7.3-rc09.aar
基础库
tangmeeting-phone-sdk.aar 云会议SDK
sdk_meeting_proxy_impl_xxx.aar 各模块连接组件
sdk_messenger_xxx.aar 消息通道模块
sdk_interaction_xxx.aar 互动功能模块
sdk_feedback_xxx.aar 云会议会中问题反馈模块
sdk_kefu_xxx.aar 云会议会中客服模块
sdk_meeting_login_xxx.aar 用户登录服务

添加资源

将Quanshi-Android-MeetingSdk/samples/app/src/main/assets文件夹下的domain.json文件拷贝至自己的项目assets父文件夹下。

资源文件

添加依赖

添加以下依赖,这些依赖是云会议SDK相关的aar必须要依赖的库

// 全时基础库
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'provideLibs')
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')

// region Android相关基础库
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9"
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.activity:activity-ktx:1.1.0'
implementation 'androidx.fragment:fragment-ktx:1.2.5'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
// endregion

// region tangmeeting.aar依赖
implementation 'com.j256.ormlite:ormlite-android:5.0'
implementation "com.github.bumptech.glide:glide:4.11.0"
implementation 'jp.wasabeef:glide-transformations:4.2.0'
implementation 'com.zhy:base-rvadapter:3.0.3'
// endregion

// region common.aar依赖
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
implementation "com.squareup.retrofit2:retrofit:2.6.2"
implementation "com.squareup.retrofit2:converter-gson:2.6.2"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.6.2"
implementation "com.squareup.okhttp3:logging-interceptor:3.10.0"
implementation 'androidx.room:room-runtime:2.2.5'
implementation "me.jessyan:autosize:1.1.2"
implementation "com.lxj:easyadapter:1.2.0"
implementation "com.sonnyjack.widget:DragView:0.1.0"
implementation "com.github.promeg:tinypinyin:2.0.3"
implementation "com.gyf.immersionbar:immersionbar:3.0.0"
implementation "com.gyf.immersionbar:immersionbar-ktx:3.0.0"
// endregion

// region skin.aar依赖
implementation 'skin.support:skin-support:4.0.5'
implementation 'skin.support:skin-support-appcompat:4.0.5'
implementation 'skin.support:skin-support-design:4.0.5'
implementation 'skin.support:skin-support-cardview:4.0.5'
implementation 'skin.support:skin-support-constraint-layout:4.0.5'
// endregion

// region 互动模块依赖
implementation "com.airbnb.android:lottie:3.4.0"
implementation 'com.google.zxing:core:3.3.0'
// endregion

// region 反馈模块依赖
implementation "com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.33"
implementation "com.blankj:utilcode:1.30.6"
implementation "me.drakeet.multitype:multitype:3.4.4"
implementation "com.elvishew:xlog:1.9.0"
implementation "com.jeremyliao:live-event-bus:1.5.7"
// endregion

// region 直播消息模块依赖
implementation 'com.netease.nimlib:basesdk:8.3.1'
implementation 'com.netease.nimlib:chatroom:8.3.1'
// endregion

implementation "com.tencent:mmkv-static:1.1.1"

添加声明

在AndroidManifest.xml文件中添加以下权限声明

<uses-sdk
        android:targetSdkVersion="33"
        tools:replace="android:targetSdkVersion"
        tools:ignore="GradleOverrides" />
    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.REORDER_TASKS" />
    <!-- 8.0+系统需要-->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <permission
        android:name="${applicationId}.permission.RECEIVE_MSG"
        android:protectionLevel="signature"/>

    <uses-permission android:name="${applicationId}.permission.RECEIVE_MSG"/>

添加混淆

在 app/proguard-rules.pro 文件中添加如下行,防止代码混淆:(按模块分拆)

-keep class com.tang.**{*;}
-keep class com.gnet.**{*;}
-keep class com.quanshi.** {*;}
-keep class org.webrtc.tang.**{*;}
-dontwarn com.netease.**
-keep class com.netease.** {*;}

实现功能

初始化

在工程的Application中进行初始化操作,注意初始化操作必须在主线程进行

// 初始化云会议(必选)    
// java写法:  
Domain.init(this,"domain.json")    // 注意,该方法需要assets文件夹下的domain.json文件,请将此文件放置于自己的对应文件夹下    
BaseContextHolder.initContext(this)
Domain.init(this)    
FileManager.init(this)
BaselibManager.init(this)
TangSdkApp.initSdk(this, "", false)
registerActivityLifecycleCallbacks(AppStateCallback())    // 初始化直播消息模块(可选) 
TangSdkApp.setCustomMessenger(MessengerProxy(this))    // 初始化互动模块(可选)
TangSdkApp.initInteraction(InteractionProxy())    // 初始化反馈模块(可选)
TangSdkApp.getModules().initFeedback(FeedbackProxy())    // 初始化客服模块(可选)
TangSdkApp.getModules().initCustomerService(KefuProxy())    // 初始化会前登录模块(可选)
LoginSdk.initSdk(this)

自定义

data class CustomConfig(
        /* 控制会议报告提示的显示,true(默认):显示;false:隐藏 */
        var showMeetingReportTips: Boolean = true,

        /* 控制入会自动连接VOIP语音提示的显示,true(默认):显示;false:隐藏 */
        var showVoipAutoSwitchTips: Boolean = true,

        /* 控制主持人退会时转移主持人提示的显示:true:显示;false(默认):隐藏 */
        var showLeaveMeetingTransferHostTips: Boolean = false
    )
调用示例:
TangInterface.setCustomConfig(
    CustomConfig(
          showMeetingReportTips = false,
          showVoipAutoSwitchTips = false,
          showLeaveMeetingTransferHostTips = false
    )
)

入会

将获取到的会议密码pcode,调用入会接口启动入会流程。

TangInterface.joinConference(context: Context, req: MeetingReq, callback: TangCallback<String>)

运行

将程序运行在Android真机设备,部分模拟器可能存在功能或性能上的缺陷,建议使用真机体验。在会中页面中,点击退会按钮,将会退出会中页面,回到app之前页面。

成功调起云会议