快速开始

前提条件

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

运行Demo

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

集成SDK

创建工程

导入文件

下载解压云会议SDK的压缩包以后,将Quanshi-Android-MeetingSdk/samples/app/libs与provideLibs目录下的所有aar拷贝到您的项目中。

SDK中的aar说明(编译时动态选择库范围):

文件名 说明 必选
base-1.0.9.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'// endregionimplementation "com.tencent:mmkv-static:1.1.1"

添加声明

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

<!-- 将com.gnet.sdk.meeting 替换成您的包名 --><permission   android:name="com.gnet.sdk.meeting.permission.RECEIVE_MSG"   android:protectionLevel="signature" /><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.FOREGROUND_SERVICE" />

添加混淆

在 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)

入会

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

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

运行

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

成功调起云会议