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
}