伯索开放平台
首页API文档SDK文档伯索官网
首页API文档SDK文档伯索官网
  1. 微课SDK接入
  • 直播SDK接入
    • WEB版本
      • WEB版本
    • iOS版本
      • IOS版本
    • Android版本
      • Android版本
  • 微课SDK接入
    • WEB版本
      • WEB版本
    • iOS版本
      • IOS版本
    • Android版本
      • Android版本
  • 批注SDK接入
    • Web版本
      • Web版本
    • iOS版本
      • IOS版本
    • Android版本
      • Android版本
  • 签名加密
    • 签名加密
  • 回调接口接入流程
    • 回调接口接入流程
  • 文档解析接入方式
    • 文档解析接入方式
  • 历史课堂接入方式
    • 历史课堂接入方式
  • 历史课堂转视频接入方式
    • 历史课堂转视频接入方式
  • 历史课堂/微课下载接口
    • 历史课堂/微课下载接口
  1. 微课SDK接入

Android版本

一. 准备阶段
应用需要用到AndroidX支持库,如果在使用Android Support库的请迁移,如果已经使用AndroidX请忽略。 迁移可参考下面的说明,或查阅
AndroidX迁移指南:
1) 切换到单独的分支,迁移完成前最好不进行功能开发,然后将代码备份一份,防止迁移失败
2) 检查项目中每个module中support库的依赖,将版本升级到28.0.0,需要将compileSdkVersion升级到28,保证项目正常能编译通过
3) 在Android Studio中Refactor->Migrate to AndroidX完成迁移
4) 编译项目,如果有编译错误,解决即可(如第三方依赖库版本不支持androidx需要升级到新版本,例如ButterKnife)
二. 配置伯索的maven仓库
在项目的build.gradle或settings.gradle文件中添加伯索的maven仓库。
 repositories {
        ...
        maven { url 'https://nexus.plaso.cn/repository/maven-public/'}
    }
三、app->build.gradle配置
在项目的app->build.gradle 中:①配置minSdkVersion需要大于等于23,②添加SDK相关的依赖。
android {
    ……
    defaultConfig {
        ……
        minSdkVersion 24  // 配置>= 24
        targetSdkVersion 33 // 配置 >= 33
        ……
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
}

dependencies {
    ...
    implementation( 'cn.plaso:styleupime:$version')
}
四、实现IResourceProvider
IResourceProvider是定制化资料中心接口, APP提供该接口的实现,并传入SDK。IResourceProvider实现后我们需要创建一个StyleUpime对象,创建StyleUpime对象需要用到IResourceProvider,IResourceProvider不能为null,后续启动微课需要使用StyleUpime对象。
verride fun onCreate() {
    super.onCreate()
    ...
    resProvider = object : IResourceProvider {
        override fun supportResourceCenter(): Boolean {
            //是否支持定制化资料中心,返回true代表支持,false代表不支持
            return false
        }

        override fun showResourceCenter() {
             //显示 APP 定制化资料中心,在此处实现跳转到定制化资料中心页面
        }

        override fun dismissResourceCenter() {
             //关闭 APP 定制化资料中心
        }

        override fun getExtFileName(extFileId: Any?, resouceCallback:IResourceCallback?) {
            //APP 根据传入的文件标识内容返回其可以访问的完整 URL
        }

        override fun signQuery(queryMap: MutableMap<String, Any>?, cb: SignCallback?): Boolean {
            //请求SDK Client进行参数签名,窗口模式下,插入文件,需要从服务器获取签名
            if (queryMap != null) {
                queryMap["appId"] = Config.appId //Config.appId填写从伯索获取的appId,这个参数是必需的
                queryMap["validTime"] = 120
                queryMap["validBegin"] =  System.currentTimeMillis() / 1000
                //根据queryMap,appKey生成一个query
                val signedQuery = SignHelper.sign(queryMap, Config.appKey) //Config.appKey填写从伯索获取的appKey
                cb?.onSignCompleted(signedQuery)
            } else {
                cb?.onSignCompleted(null)
            }
            return true
        }

        override fun getWebviewUrl(type: Int, callback: IUrlCallback?) {
            //请求SDK Client是否有教材包的链接需要在课堂内打开
            callback?.onGetUrl("https://www.plaso.cn")
        }
    }
    //创建一个StyleUpime对象
    upime = StyleUpime.create(this, "demo", resProvider)
}
在signQuery方法中我们需要生成一个query,生成方法参考如下形式:
object SignHelper {

    /**
     * Sign the [params] with specific [signKey]
     */
    fun sign(params: MutableMap<String, Any>, signKey: String): String {
        val keys = params.keys.sorted()//将Map中的key按顺序排列
        val sortedParams = StringBuilder()
        for ((index, key) in keys.withIndex()) {
            if (index != 0) {
                sortedParams.append("&")
            }
            sortedParams.append("$key=${params[key]}")
        }

        val signature = encrypt(sortedParams.(), signKey)
        params["signature"] = signature;
        return buildQuery(params);
    }

    private fun buildQuery(params: MutableMap<String, Any>): String {
        val result = StringBuilder()
        for ((index, key) in params.keys.withIndex()) {
            if (index != 0) {
                result.append("&")
            }
            result.append("$key=${URLEncoder.encode(params[key].toString(), "UTF-8")}")
        }
        return result.()
    }

    private fun encrypt(encryptText: String, signKey: String): String {
        val algorithm = "HmacSHA1"
        val charset = Charset.forName("UTF-8")
        val data = signKey.toByteArray(charset)

        val secretKey = SecretKeySpec(data, algorithm)
        val mac = Mac.getInstance(algorithm)
        mac.init(secretKey)
        val rst = mac.doFinal(encryptText.toByteArray(charset))

        return BigInteger(1, rst).(16).toUpperCase()
    }

五、启动微课录制
启动微课需要构建一个MiniLessonConfig对象,MiniLessonConfig对象需要进行一些参数配置。MiniLessonConfig对象创建完毕后只需要通过StyleUpime对象调用launchMiniLesson方法即可启动微课。
private fun startMiniLesson(lessonInfoWrap: LessonInfoWrap?) {
        val config = MiniLessonConfig()
        // config.openFileMode = openFileMode
        //微课支持新建和草稿两种形式,对于草稿可继续编辑
        if (lessonInfoWrap == null) { //新建
            if (!TextUtils.isEmpty(mini_title.text.())) {
                config.topic = mini_title.text.()      //"微课测试_" + Random(System.currentTimeMillis()).nextInt()
            }
            //设置草稿保存路径
            config.draftPath =
                "${getExternalFilesDir(null)?.absolutePath}/mini/${System.currentTimeMillis()}"
        } else { //草稿
            config.topic = lessonInfoWrap.lessonInfo.topic
            //设置草稿路径
            config.draftPath = lessonInfoWrap.lessonInfo.path
        }

        File(config.draftPath).also {
            if (!it.exists()) {
                it.mkdirs()
            }
        }

        config.supportDraft = supportSaveDraft;
        config.supportUndo = supportUndo;
        config.teachToolTypes = teachToolTypes
        config.openFileMode = openFileMode
        config.recordType = recordType
        config.enableInteractPpt = enablePptInteract

        var extraJson = JSONObject()
        extraJson.put("id", "weikebao_id1");
        config.extra = extraJson.();

        //启动微课,upime是step.4创建的StyleUpime对象
        upime.launchMiniLesson(config, object : IMiniLessonListener {
            override fun onMiniLessonReady(upimeBoard: UpimeBoard?) {
                // 微课准备完成,获得UpimeBoard对象,可用于资料中心的资料插入等操作
            }

            override fun onClosed() {
                //微课退出通知
            }

            override fun onDraftSaved(draft: LessonInfo?) {
                 //保存草稿通知
            }

            override fun onFinished(info: LessonInfo?) {
                //微课录制完成通知
            }

            override fun onSkinChanged(skinId: Int) {
                //微课背景皮肤改变通知
            }

        })
    }
MiniLessonConfig参数说明:
** topic **** String **否-**微课主题名称 **
draftPathString是-微课草稿本地保存路径
openFileModeint否null文件打开模式
supportDraftBoolean否true是否支持存为草稿
参数名参数类型是否必要默认值参数说明
enableInteractPptBoolean否false是否开启PPT交互
teachToolTypesint否0是否打开教具
supportUndoBoolean否false是否支持撤销操作
recordTypeint否0微课录制类型音频传:1视频传:2
六、预览微课
预览微课只需要通过StyleUpime对象调用playMiniLesson方法,将微课保存的路径传入即可预览微课。
private fun preview(it: LessonInfoWrap) {
        //预览微课,upime是step.4创建的StyleUpime对象
        upime.playMiniLesson(it.lessonInfo.path, object : ILessonProvider {
            override fun getFileName(name: String?): String {
                //获取文件名
                return "$name"
            }
        })
    }
七、上传微课
微课内容上传到自己的OSS。
八、删除微课
对于编辑状态下的微课需要通过StyleUpime对象调用deleteDraft方法删除,其他状态只需要删除本地微课或已上传到OSS的微课即可。
fun deleteLesson(it: LessonInfoWrap) {
        if (it.status == RECORDED || it.status == EDITING) {
          //删除微课,upime是step.4创建的StyleUpime对象
           upime.deleteDraft(configKey, it.lessonInfo.path)
        } else {
           //删除本地微课或者上传到OSS的微课
        }
}
九、参考代码Demo
以上就是微课SDK的集成步骤,更加详细步骤请参考代码Demo,
请点击下载
使用步骤
1.
下载代码并解压到本地
2.
修改build.gradle文件,升级版本到1.28.804
implementation 'cn.plaso:styleupime:1.28.804'
3.
修改文件: app/src/main/java/cn/plaso/liveclasssdkdemo/Config.kt, 填入伯索分配的appid和key后即可体验
修改于 2024-06-07 09:56:41
上一页
IOS版本
下一页
Android版本
Built with