2 快速集成 - polyv/polyv-android-cloudClass-sdk-demo GitHub Wiki

1 阅读准备

提前下载保利威云课堂Demo,请先下载Demo

2 环境要求

以下要求为硬性要求:

名称 要求
minSdkVersion >=21 (Android 5.0)
targetSdkVersion >=27 (Android 8.1)
abiFilters arm64-v8a、armeabi-v7a、x86
jdk version 1.7.0
集成工具 Android Studio

注1:开发者如需兼容minSdkVersion >= 16 (Android 4.x设备),请按OkHttp4.x版本降级到3.x兼容方案处理。

注2:so库的配置只能使用[arm64-v8a、armeabi-v7a、x86]的一种或几种,否则可能在部分机型上出现崩溃或者音画不同步、跳秒播放等情况。

注3:如需适配Android 11,即targetSdkVersion=30,目前需要暂时关闭指针标记功能(Android官方关于指针标记的说明),参考以下代码修改AndroidManifest.xml以关闭指针标记。

  <application 
    android:allowNativeHeapPointerTagging="false">
    ...
  </application>

3 目录结构说明

模块名 作用
app 播放、聊天、连麦等功能演示
commonui 主要为一些自定义view、工具类等

4 功能模块集成

4.1 项目环境配置

4.1.1 配置方法数超过 64K 的应用

如果您项目中还没有multiDex配置,则需要加上。配置方式可以参考配置方法数超过 64K 的应用

4.1.2 调整sdkVersion

打开您项目的app/build.gradle文件(app/..皆指您项目的application模块),把里面的minSdkVersion设置为21或以上,把targetSdkVersion设置为27或以上。

4.1.3 添加abiFilters

打开您项目的app/build.gradle文件,添加如下代码:

ndk {
    abiFilters 'arm64-v8a', "armeabi-v7a", "x86" // DO NOT MODIFY THIS LINE, IT'S UPDATED BY BUILD MACHINE AUTOMATICALLY.
}

如果您项目原来就有该配置,并且abiFilters配置的范围在上述的范围内,则不要更改。

4.1.4 配置maven地址

打开您项目的project/build.gradle文件,添加如下代码:

maven { url "https://jitpack.io" }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases/' }
mavenCentral()
maven { url 'https://maven.aliyun.com/repository/public' }
4.1.5 配置模块版本

由于app和commonui模块中的sdkVersionversionCode等信息是用polyv-demo的project/build.gradle配置,故需要将其添加到您的项目中,才能使模块正常编译和运行。

打开您项目的project/build.gradle文件,添加如下代码(代码也可从下载的polyv-demo中复制过来):

ext {
	compileSdkVersion = 27
	minSdkVersion = 21
	targetSdkVersion = 27
	versionCode = 70
	versionName = "0.7.0"
}

4.2 导入模块

4.2.1 导入commonui模块

在您的项目中,选择Import Module...->选择polyv-demo的commonui目录->点击Finish。导入完成后,打开您项目的project/settins.gradle文件,添加如下代码:

include ':commonui'
4.2.2 导入app模块

在您的项目中,选择Import Module...->选择polyv-demo的app目录->选择完成后,将Module name: app更改为Module name: polyvapp->点击Finish。导入完成后,打开您项目的project/settings.gradle文件,添加如下代码:

include ':polyvapp'

commonui和app(polyvapp)模块都导入完成后,这时是已经可以正常运行polyvapp模块了。接下来需要将polyvapp由application模块类型更改为library模块类型,以供您的application模块可以直接调用。

4.3 更改polyvapp模块类型

将polyvapp模块由application模块类型更改为library模块类型,需要以下步骤:

(1) 打开该模块的polyvapp/build.gradle文件,更改如下代码:

apply plugin: 'com.android.application' -> apply plugin: 'com.android.library'

defaultConfig {
	consumerProguardFiles 'proguard-rules.pro' -> 添加这行代码
	applicationId "com.easefun.polyv.cloudclassdemo" -> 注释/删除这行代码
}

//注释掉打包app用到的配置,例如:
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}_${variant.versionName}_${currentTime()}.apk"
    }
}

(2) 打开该模块的polyvapp/src/main/AndroidManifest.xml文件,更改如下代码:

    <!--删除application的属性配置,并注释程序入口-->
    <application>
        <activity
            android:name=".login.PolyvCloudClassLoginActivity"
            android:windowSoftInputMode="stateHidden|adjustResize">
<!--            <intent-filter>-->
<!--                <action android:name="android.intent.action.MAIN" />-->
<!--                <category android:name="android.intent.category.LAUNCHER" />-->
<!--            </intent-filter>-->
        </activity>
        ...
    </application>

(3) 打开该模块中的PolyvCloudClassApp.java文件,更改如下代码:

原来polyv-sdk的初始化是放到polyv-demo的PolyvCloudClassApponCreate方法里执行,现在改为了library,则需要把PolyvCloudClassApponCreate方法里的代码提取出来封装到一个静态方法里,供您的ApplicationonCreate方法里调用。

//新增以下方法,并把原来onCreate方法里的初始化代码剪切到这里来
public static void init(Application application) {
    // Normal app init code...
    PolyvCommonLog.setDebug(true);
    PolyvLiveSDKClient liveSDKClient = PolyvLiveSDKClient.getInstance();
    liveSDKClient.initContext(application);

    PolyvVodSDKClient client = PolyvVodSDKClient.getInstance();
    client.setConfig(config, aeskey, iv);
}

//由于原来的config、aeskey、iv是非静态成员,所以需要更改为静态成员才能在静态方法里使用
private static String iv = "2u9gDPKdX6GyQJKU";
private static String aeskey = "VXtlHmwfS2oYm0CZ";
private static String config = "";

(4) 选中该模块目录,点击Build->Make Module 'polyvapp',待编译完成后,会发现报**Compilation failed; see the compiler error output for details.**错误。点开左侧的Java compiler可以发现具体的错误为"错误;需要常量表达式",这是由于library模块里的资源id不是常量,不能使用switch语句导致的。

解决方式:点击错误信息定位到对应的代码,把switch语句改为if语句。如果是windows系统,选中switch,按alt+enter,选择Replace 'switch' with 'if'即可完成替换。

4.4 依赖polyvapp模块

打开您项目的app/build.gradle文件,添加以下代码即可完成对polyvapp模块的依赖:

implementation project(':polyvapp')

修改polyvapp模块的build.gradle文件,对commonui模块的依赖方式,以保证能在主项目中使用SDK。

api project(':commonui')

至此已完成对polyv云课堂sdk的模块集成。

5 初始化sdk

打开您项目的Application.java这个文件(在AndroidManifest.xml里配置了application name的类),在onCreate方法里添加如下代码:

PolyvCloudClassApp.init(this);

至此已完成对polyv云课堂sdk的模块集成和初始化。

6 进入登录页

在您项目的Activity中,使用startActivity(new Intent(this, PolyvCloudClassLoginActivity.class));代码即可跳转到登录页。

如果调用代码报java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.错误,把您项目的AndroidManifest.xml文件里的application标签的android:theme改为Theme.AppCompat.Light.NoActionBar即可解决。

登录页的作用是检验参数及获取频道的直播/回放类型,再把参数传给观看页以创建对应类型的播放器播放视频。

7 进入观看页

(1) 观看页可以由登录页点击登录进入。

(2) 观看页在polyv-demo中是以一个页面交互设计的,如果您需要直接跳到观看页,并且已知频道的直播/回放类型,则调用以下的代码即可:

//配置账号信息,账号信息在直播后台开发设置中有展示
PolyvLinkMicClient.getInstance().setAppIdSecret(appId, appSecert);
PolyvLiveSDKClient.getInstance().setAppIdSecret(appId, appSecert);
PolyvVodSDKClient.getInstance().initConfig(appId, appSecert);

//根据您的需求选择下面一种方式进入观看页,使用方式在Demo登录页有展示
//播放直播
PolyvCloudClassHomeActivity.startActivityForLive(this, channelId, userId, isAlone);//isAlone为是否是普通直播类型
//0.13.0开始,新增了isParticipant,rtctype
//开发者应当通过SDK请求服务器rtctype的值传参再跳转,获取方式参考demo的requestLiveDetail方法
//注意,rtctype暂不支持ucloud方式
PolyvCloudClassHomeActivity.startActivityForLiveWithParticipant(activity, channelId, userId, isNormalLive, isParticipant,rtcType);

//播放回放
PolyvCloudClassHomeActivity.startActivityForPlayBack(this, playbackVideoId, playbackChannelId, playbackUserId, isNormalLivePlayBack, videoListType);//「videoListType : 0 回放列表 | videoListType : 1 点播列表 」

(3) 如果您需要校验参数或者获取直播/回放类型,可以用以下的方法:

//检验参数
//注意直播类型的参数校验时,不能传vid
//回放类型的参数校验时,不能传appSecret
PolyvLoginManager.checkLoginToken(String userId, String appSecret, String appId, String channelId, String vid, PolyvrResponseCallback callback);
//获取频道的直播类型
PolyvResponseExcutor.excuteUndefinData(PolyvApiManager.getPolyvLiveStatusApi().geLiveStatusJson(channelId), responseCallback);
//获取vid的回放类型
PolyvLoginManager.getPlayBackType(String vid, PolyvrResponseCallback<PolyvPlayBackVO> polyvResponseCallback);

(4)如果要使用聊天室私有化部署(聊天室域名切换)的功能

那么必须要调用:PolyvLoginManager.checkLoginToken,从返回的结果的PolyvChatDomain变量,设置到聊天室私有域名管理器类中:

PolyvChatDomainManager.getInstance().setChatDomain(responseBean);

以上方法的用例皆可在PolyvCloudClassLoginActivity中找到。

8 接入用户体系

在PolyvCloudClassHomeActivity中默认实现了观看用户的用户id和昵称。开发者需要修改赋值为自己用户系统的用户id和昵称,才能保证sdk与开发者应用的数据连通。

    private void initialStudentIdAndNickName() {
        //初始化观众id和观众昵称,用于统计数据
        if (isParticipant) {
            viewerId = PolyvVClassGlobalConfig.viewerId;
            viewerName = PolyvVClassGlobalConfig.username;
        } else {
            //todo 这里仅为了展示使用,开发者应当将viewerid、viewerName设置为观看学员的用户ID和昵称,以保证直播SDK的统计数据映射到开发者的用户系统
            viewerId = "" + Build.SERIAL;
            viewerName = "学员" + viewerId;
        }

        PolyvVClassGlobalConfig.userId = userId;
    }
⚠️ **GitHub.com Fallback** ⚠️