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 必二选一 |
邮箱 | 否。倘若开启了直播白名单验证,则需要传入 | |
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
}