Android直播SDK集成说明

6.16版本发布说明

1、Android targetSdkVersion升级到33,适配Android 13

2、为适配Android 13, 升级网易云信版本号到8.9.116

3、修改AndroidManifest.xml,添加如下配置:

<uses-feature
    android:name="android.hardware.camera"
    android:required="false" />
<uses-feature
    android:name="android.hardware.telephony"
    android:required="false" />

4、升级第三方依赖库: com.google.android.flexbox:flexbox:3.0.0

前提说明

Android X架构(不支持旧Android Support架构,Google官方已不再维护)。

Android targetSdk最高为33。

Android Sdk版本最低为21。

Android Studio版本最低为3.0。

一、下载并引入SDK

下载到直播SDK的压缩包以后,解压开可以看到livesdk_sample项目,把/livesdk_sample/live_demo/libs目录下的所有aar拷贝到您的项目中

1、SDK中的aar说明

文件名 说明 必选
base-xxx.aar
common-xxx.aar
component-xxx.aar
danmaku-xxx.aar
dsbridge-xxx.aar
emoiji-xxx.aar
skin-xxx.aar
fs-xxx.aar
videosdk-xxx.aar
pictureselector-xxx.aar
基础库 是
sdk_live_core_xxx.aar 直播SDK核心功能 是
sdk_live_xxx.aar 直播SDK 是
sdk_live_meeting_xxx.aar 直播SDK连麦功能 否
sdk_live_rtc_xxx.aar 直播SDK无延迟播放器功能 否
sdk_meeting_proxy_impl_xxx.aar 各模块连接组件 是
sdk_messenger_xxx.aar 消息通道模块 是
tangmeeting-phone-sdk_xxx.aar 云会议会中SDK;直播间举手连麦功能,可根据需求选择集成 否
sdk-meeting-shell_xxx.aar 主播端模块,tangmeeting-phone-sdk需要依赖该aar 否
sdk_interaction_xxx.aar 互动功能模块 否
sdk_feedback_xxx.aar 云会议会中问题反馈模块 否
sdk_kefu_xxx.aar 云会议会中客服模块 否
sdk_meeting_login_xxx.aar 用户登录服务 否

2、添加依赖

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

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

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.github.tbruyelle:rxpermissions:0.12'
implementation "io.reactivex.rxjava3:rxjava:3.0.4"
implementation 'androidx.activity:activity-ktx:1.2.0'
implementation 'androidx.fragment:fragment-ktx:1.3.5'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
implementation 'org.jsoup:jsoup:1.12.1'

// 本地数据库
implementation 'androidx.room:room-runtime:2.3.0'
implementation 'androidx.room:room-ktx:2.3.0'
implementation "androidx.room:room-runtime:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"

// region tangmeeting.aar依赖
implementation 'com.j256.ormlite:ormlite-android:5.0'
implementation 'com.github.ctiao:DanmakuFlameMaster:0.9.25'
implementation 'com.github.ctiao:ndkbitmap-armv7a:0.9.21'
implementation 'com.github.ctiao:ndkbitmap-x86:0.9.21'
implementation 'jp.wasabeef:glide-transformations:4.2.0'
implementation 'com.zhy:base-rvadapter:3.0.3'

implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'

implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation "com.airbnb.android:lottie:3.4.0"

// 基础功能 (必需)
implementation 'com.netease.nimlib:basesdk:8.9.116'
// 聊天室需要
implementation 'com.netease.nimlib:chatroom:8.9.116'

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'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.lifecycle:lifecycle-common:2.5.1'

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.github.promeg:tinypinyin:2.0.3"
implementation "com.gyf.immersionbar:immersionbar:3.0.0"
implementation "com.gyf.immersionbar:immersionbar-ktx:3.0.0"
implementation "com.elvishew:xlog:1.9.0"
implementation "androidx.multidex:multidex:2.0.0"
implementation 'com.blankj:utilcode:1.30.6'
implementation "com.tencent:mmkv-static:1.1.1"
implementation 'com.google.android.flexbox:flexbox:3.0.0'

// -------- video sdk ----------
implementation 'com.github.CarGuo:GSYIjkJava:1.0.0'
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-arm64:v8.3.4-release-jitpack'
implementation 'com.google.android.exoplayer:exoplayer:2.14.1'
implementation 'com.google.android.exoplayer:exoplayer-core:2.14.1'
implementation 'com.google.android.exoplayer:exoplayer-dash:2.14.1'
implementation 'com.google.android.exoplayer:exoplayer-hls:2.14.1'
implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:2.14.1'
implementation 'com.google.android.exoplayer:extension-rtmp:2.14.1'
// -----------------------------

implementation('io.socket:socket.io-client:1.0.1') {
    // excluding org.json which is provided by Android
    exclude group: 'org.json', module: 'json'
}

3、添加AndroidManifest声明

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

<!-- 将com.gnet.live 替换成您的包名 -->
<permission
   android:name="com.gnet.live.permission.RECEIVE_MSG"
   android:protectionLevel="signature" />
<!-- 适配Android 13 -->
<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.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_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.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" />

二、直播SDK快速集成

1、初始化

我们支持两种初始化方式,以满足您的集成需求:

初始化方法一:在Application的onCreate中直接进行初始化操作:

QSLiveSDK.init()

注意:该方法必须在Application的onCreate()方法中调用,否则聊天室功能不可用

初始化方法二: 倘若您需要延迟进行初始化操作(隐私合规需求),可以使用QSLiveSDK.config()与QSLiveSDK.lateinit()配合使用。

QSLiveSDK.config() 注意:必须在Application的onCreate()方法中调用,该方法不会有性能损耗。

QSLiveSDK.lateinit() 注意:该方法无初始化作用域限制。

绑定连麦/会议功能,无需此功能可剔除tangmeeting-phone-sdk.aar(优化包体积大小)

QSLiveSDK.bindMeeting(QSMeetingImpl())

绑定无延迟播放器功能,无需此功能可提剔除sdk_live_rtc_xx.aar(优化包体积大小)

QSLiveSDK.bindWebrtc(QSWebrtcImpl())

2、进入和退出直播间

(1)进入直播间

接口:QSLiveSDK.joinLive(context: Context, req: QSLiveReq, callback: (resultCode: Int) -> Unit)

需要传递的参数定义在QSLiveReq类中

类名 参数 说明
context 上下文,Activity的实例  
QSLiveReq 见下面的详细说明 进入直播间需要传递的参数

https://developer.quanshi.com/cn/api/77 参数来自云直播详情接口

如果直播开启了白名单验证,进入直播间时需要传入手机号或邮箱,只有在白名单配置中的手机号或邮箱才能成功进入直播间
callback 进入直播状态回调 0为成功,非0见下面的详细说明

QSLiveReq参数详细说明

参数 说明 必传
userName 姓名。 在直播间中显示或在云会议会中显示的姓名 是。倘若audienceJoinUrl如果有user相关信息会覆盖
pcode 直播码 否。与audienceJoinUrl 必二选一
meetingCode 会议密码 否
conferenceId 会议ID 否
audienceJoinUrl 观众链接 否。与pcode 必二选一
email 邮箱 否。倘若开启了直播白名单验证,则需要传入
phone 手机号 否。倘若开启了直播白名单验证,则需要传入
countryCode 国家码。如果手机号有别的国家码,需要传入,不要带+加号,如:中国传86 否。与phone字段配合使用,如果不传phone字段,也不要传该字段
company 机构名或公司名 否
avatar 头像URL,在云会议会中展示 否
extUserId 第三方用户系统的userId,主要用于统计 否

resultCode参数详细说明

返回码 说明
0 成功
-1 参数缺失
-1000 网络请求异常
10111 当前用户其他端在线(设备冲突)
10112 当前用户其他会在线(会议冲突)
10202 该直播不存在
50701 直播密码错误
56001 不在白名单内

(2)退出直播间

接口:QSLiveSDK.exitLive()接口。

注意:该接口在直播间页面销毁时自动调用,默认情况下可以不调用此接口。

(3)监听直播间进出状态

QSLiveSDK提供了监听进出直播间状态的接口,可以实现下面的接口来监听状态回调。注意,状态监听的添加与移除需要配对调用,且与具体的某一场直播无关。

// 添加状态监听
QSLiveSDK.addLiveRoomListener(listener: QSLiveRoomListener)
// 移除状态监听
QSLiveSDK.removeLiveRoomListener(listener: QSLiveRoomListener)

interface QSLiveRoomListener {

   /**
    * 进出直播间状态回调
    *
    * 1、在调用QSLiveSDK.joinLive()接口时,回调 JOIN 状态
    * 2、在直播间loading消失后, 回调 JOINED 状态
    * 3、在调用退出直播间接口时,回调 LEAVING状态
    * 4、在直播间界面消失后,回调LEFT状态
    */
    fun onLiveStatusChanged(status: QSLiveRoomStatus)

    /**
      * 直播间信息变更,会在加入直播成功后提供直播间信息
       */
    fun onLiveRoomInfoChanged(info: QSLiveRoomInfo) 

    /**
     * 画中画回调
      */
    fun onPicInPicChange(isPicInPic: Boolean) 

    /**
       * 直播带货回调 [context]加入直播时的context对象 [info]直播带货商品信息
      */
       fun onBuyProduct(context: Context, info: LiveGoods) 
}

enum class QSLiveRoomStatus {

    /** 正在进入 */
    JOIN,

    /** 取消 */
    CANCEL,

    /** 进入直播间成功 */
    JOINED,

    /** 正在退出直播间 */
    LEAVING,

    /** 退出直播间 */
    LEFT
}