Android 工程配置
系统要求
SDK 建议使用Android 5.0(API Level 21)及以上系统。
开发环境
以下是 SDK 的开发环境,App 开发环境不需要与 SDK 一致,但要保证兼容:
Android NDK:android-ndk-r12b
Android SDK Tools:android-sdk_25.0.2
minSdkVersion:21
targetSdkVersion:26
Android Studio(推荐您使用 Android Studio)
步骤1:集成 SDK
1. 新建工程![](https://qcloudimg.tencent-cloud.cn/image/document/162a91d42505f63445e1d3606a0bd4ae.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/162a91d42505f63445e1d3606a0bd4ae.png)
2. 工程配置
2.1 在工程 App 目录下的 build.gradle 中,添加引用 aar 包的代码:
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])// 导入短视频 SDK aar,LiteAVSDK_UGC_x.y.zzzz 请自行修改为最新版本号compile(name: 'LiteAVSDK_UGC_10.7.1136', ext: 'aar')...}
2.2 在工程目录下的 build.gradle 中,添加 flatDir,指定本地仓库:
allprojects {repositories {jcenter()flatDir {dirs 'libs'}}}
2.3 在 App 工程目录下的 build.gradle 的 defaultConfig 里面,指定 ndk 兼容的架构:
defaultConfig {...ndk {abiFilters "armeabi-v7a", "arm64-v8a"}}
2.4 最后单击 Sync Now,编译工程。
1. 库说明
解压 zip 压缩包后得到 libs 目录,里面主要包含 jar 文件和两种架构的 so 文件,文件如下图: ![](https://qcloudimg.tencent-cloud.cn/image/document/4f844c4e09744d086d5e802f5c368270.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/4f844c4e09744d086d5e802f5c368270.png)
2. 拷贝文件
如果您的工程之前没有指定过 jni 的加载路径,推荐您将刚才得到的 jar 包和 对应架构so 库拷贝到 Demo\\app\\src\\main\\jniLibs 目录下,这是 Android Studio 默认的 jni 加载目录。jar文件放置在libs文件夹下。
3. 如果您购买了腾讯特效,那么还需要按照腾讯特效的方案集成 腾讯特效 模块
4. 工程配置
在工程 App 目录下的 build.gradle 中,添加引用 jar 包和 so 库的代码。
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])// 导入腾讯云短视频SDK jarcompile fileTree(dir: 'src/main/jniLibs', includes: ['*.jar'])...}
5. 减少 APK 体积
整个 SDK 的体积主要来自于 so 文件,这些 so 文件是 SDK 正常运行所依赖的音视频编解码库、图像处理库以及声学处理组件,如果短视频 SDK 的功能不是 App 的核心功能,您可以考虑采用在线加载的方式减少最终 apk 安装包的大小。
集成了腾讯特效功能可以参考 腾讯特效减少包体积
6. 上传 so 文件
将 SDK 压缩包中的 so 文件上传到 COS,并记录下载地址,例如
http://xxx-appid.cossh.myqcloud.com/so_files.zip
。7. 启动准备
在用户启动 SDK 相关功能前,例如开始播放视频之前,先用 loading 动画提示用户“正在加载相关的功能模块”。
8. 下载 so 文件
在用户等待过程中,App 就可以到
http://xxx-appid.cossh.myqcloud.com/so_files.zip
下载 so 文件,并存入应用目录下(例如应用根目录下的 files 文件夹),为了确保这个过程不受运营商 DNS 拦截的影响,请在文件下载完成后校验 so 文件的完整性。9. 加载 so 文件
等待所有 so 文件就位以后,调用 TXLiveBase 的 setLibraryPath 将下载的目标 path 设置给 SDK, 然后再调用 SDK 的相关功能。之后,SDK 会到这些路径下加载需要的 so 文件并启动相关功能。
1. 在 dependencies 中添加 LiteAVSDK_UGC 的依赖。
若使用3.x版本的
com.android.tools.build:gradle
工具,请执行以下命令:dependencies {implementation 'com.tencent.liteav:LiteAVSDK_UGC:latest.release'}
若使用2.x版本的
com.android.tools.build:gradle
工具,请执行以下命令:dependencies {compile 'com.tencent.liteav:LiteAVSDK_UGC:latest.release'}
2. 在 defaultConfig 中,指定 App 使用的 CPU 架构。
defaultConfig {ndk {abiFilters "armeabi-v7a", "arm64-v8a"}}
说明
目前 SDK 支持 armeabi-v7a 和 arm64-v8a。
3. 单击 Sync Now,自动下载 SDK 并集成到工程里。
步骤2:配置 App 权限
在 AndroidManifest.xml 中配置 App 的权限,音视频类 App 一般需要以下权限:
<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.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.Camera"/><uses-feature android:name="android.hardware.camera.autofocus" />
步骤3:设置 License
1. 参考 License 申请 的指引申请 License 后,从 云点播控制台 复制 License Key 和 License URL,如下图所示:
![](https://qcloudimg.tencent-cloud.cn/image/document/16d608981fb7a7b7e94380fa4866a2b0.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/16d608981fb7a7b7e94380fa4866a2b0.png)
2. 在您的应用中使用短视频功能之前,建议在
- Application onCreate()
中进行如下设置:public class DemoApplication extends Application {String ugcLicenceUrl = ""; // 填入您从控制台申请的 licence urlString ugcKey = ""; // 填入您从控制台申请的 licence key@Overridepublic void onCreate() {super.onCreate();TXUGCBase.getInstance().setLicence(instance, ugcLicenceUrl, ugcKey);}}
说明
对于使用4.7版本 License 的用户,如果您升级了 SDK 到4.9版本,您可以登录控制台,单击下图的切换到新版 License 按钮生成对应的 License Key 和 License URL,切换后的 License 必须使用4.9及更高的版本,切换后按照上述操作集成即可。
![](https://qcloudimg.tencent-cloud.cn/image/document/fd0dfe321353f868b4b11e832fb5e6b2.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/fd0dfe321353f868b4b11e832fb5e6b2.png)
步骤4:打印 log
在 TXLiveBase 中可以设置 log 是否在控制台打印以及 log 的级别,具体代码如下:
setConsoleEnabled
设置是否在 Android Studio 的控制台打印 SDK 的相关输出。
setLogLevel
设置是否允许 SDK 打印本地 log,SDK 默认会将 log 写到 sdcard 上,Android/data/应用包名/files/log/tencent/liteav 文件夹下。如果您需要我们的技术支持,建议将此开关打开,在重现问题后提供 log 文件,非常感谢您的支持。
TXLiveBase.setConsoleEnabled(true);TXLiveBase.setLogLevel(TXLiveConstants.LOG_LEVEL_DEBUG);
步骤5:编译运行
在工程中调用 SDK 接口,获取 SDK 版本信息,以验证工程配置是否正确。
1. 引用 SDK:
在 MainActivity.java 中引用 SDK 的 class:
import com.tencent.rtmp.TXLiveBase;
2. 调用接口:
在 onCreate 中调用
getSDKVersioin
接口获取版本号:String sdkver = TXLiveBase.getSDKVersionStr();Log.d("liteavsdk", "liteav sdk version is : " + sdkver);
3. 编译运行:
如果前面各步骤都操作正确,Demo工程将顺利编译通过,运行之后将在 logcat 中看到如下 log 信息:
09-26 19:30:36.547 19577-19577/ D/liteavsdk: liteav sdk version is : 7.4.9211
问题排查
如果您将 SDK 导入到您的工程,编译运行出现类似以下错误:
Caused by: android.view.InflateException:Binary XML file #14:Error inflating class com.tencent.rtmp.ui.TXCloudVideoView
可以按照以下流程来排查问题:
1. 确认是否已经将 SDK 中的 jar 包和 so 库放在 jniLibs目录下。
2. 如果您使用 aar 集成方式的完整版本,在工程目录下的 build.gradle 的 defaultConfig 里面确认下是否将 x64 架构的 so 库过滤掉。
defaultConfig {...ndk {abiFilters "armeabi-v7a", "arm64-v8a"}}
3. 检查下混淆规则,确认已将 SDK 的相关包名加入了不混淆名单。
-keep class com.tencent.** { *; }
4. 配置 App 打包参数。
![](https://qcloudimg.tencent-cloud.cn/image/document/f93c6a8a3d4984acd32b0b43c789db99.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/f93c6a8a3d4984acd32b0b43c789db99.png)
快速接入短视频功能模块
集成 UGCKit
1. 新建工程(Empty Activity)
1.1 创建一个空的 Android Studio 工程,工程名可以为
ugc
,包名可自定义,保证新建的空工程编译通过。1.2 配置 Project 的
build.gradle
。// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {repositories {google()jcenter()}dependencies {# 拷贝开始classpath 'com.android.tools.build:gradle:3.6.1'# 拷贝结束// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}}allprojects {repositories {google()jcenter()# 拷贝开始flatDir {dirs 'src/main/jniLibs'dirs project(':ugckit').file('libs')}# 拷贝结束jcenter() // Warning: this repository is going to shut down soon}}task clean(type: Delete) {delete rootProject.buildDir}# 拷贝开始ext {compileSdkVersion = 29buildToolsVersion = "29.0.2"supportSdkVersion = "26.1.0"minSdkVersion = 21targetSdkVersion = 26versionCode = 1versionName = "v1.1"proguard = truerootPrj = "$projectDir/.."ndkAbi = 'armeabi-v7a'liteavSdk = "com.tencent.liteav:LiteAVSDK_UGC:latest.release"}# 拷贝结束
1.3 配置 app 的 build.gradle 。
plugins {id 'com.android.application'}android {# 拷贝开始compileSdkVersion = rootProject.ext.compileSdkVersionbuildToolsVersion = rootProject.ext.buildToolsVersion# 拷贝结束defaultConfig {applicationId "com.yunxiao.dev.liteavdemo"# 拷贝开始minSdkVersion rootProject.ext.minSdkVersiontargetSdkVersion rootProject.ext.targetSdkVersionversionCode rootProject.ext.versionCodeversionName rootProject.ext.versionNamerenderscriptTargetApi = 19renderscriptSupportModeEnabled = truemultiDexEnabled = truendk {abiFilters rootProject.ext.ndkAbi}# 拷贝结束testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}}dependencies {# 拷贝开始implementation fileTree(include: ['*.jar'], dir: 'libs')implementation 'com.google.android.material:material:1.0.0'implementation 'androidx.recyclerview:recyclerview:1.0.0'implementation 'com.google.code.gson:gson:2.3.1'implementation 'com.tencent.rqd:crashreport:3.4.4'implementation 'com.tencent.rqd:nativecrashreport:3.9.2'implementation 'com.github.castorflex.verticalviewpager:library:19.0.1'implementation 'com.squareup.okhttp3:okhttp:3.11.0'implementation 'de.hdodenhof:circleimageview:3.1.0'implementation rootProject.ext.liteavSdkimplementation project(':ugckit')implementation 'androidx.constraintlayout:constraintlayout:2.1.3'implementation('com.blankj:utilcode:1.25.9', {exclude group: 'com.google.code.gson', module: 'gson'})# 拷贝结束}
1.4 配置 Gradle 版本:
distributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
2. 导入相关 module
2.1 拷贝
ugckit module
到 您新建的工程 ugc 目录下。2.2 如何集成基础美颜,拷贝
beautysettingkit module
到您新建的工程 ugc 目录下。2.3 如何集成腾讯特效,拷贝
xmagickit module
到您新建的工程 ugc 目录下,参考文档。2.4 在工程的
settings.gradle
中导入 ugckit。2.5 在新建的工程
UGC/settings.gradle
下指明引入这几个 module:include ':ugckit'include ':beautysettingkit'include ':xmagickit'
2.6 在工程 app module 中依赖 UGCKit module:
implementation project(':ugckit')
3. 申请 Licence
在使用 UGCKit 之前要先设置 License,License 的获取方法请参见 License 申请。
实现录制、导入、裁剪、特效编辑功能
1. 设置 Licence,初始化 UGCKit
在您使用短视频功能之前尽可能早的设置 Licence,初始化 UGCKit。
// 设置LicenceTXUGCBase.getInstance().setLicence(this, ugcLicenceUrl, ugcKey);// 初始化UGCKitUGCKit.init(this);
2. 视频录制
2.1 新建录制 xml, 加入如下配置:
<com.tencent.qcloud.ugckit.UGCKitVideoRecordandroid:id="@+id/video_record_layout"android:layout_width="match_parent"android:layout_height="match_parent" />
2.2 在
res/values/styles.xml
中新建空的录制主题,继承 UGCKit 默认录制主题。<style name="RecordActivityTheme" parent="UGCKitRecordStyle"/>
2.3 新建录制 Activity ,继承
FragmentActivity
,实现接口ActivityCompat.OnRequestPermissionsResultCallback
,获取 UGCKitVideoRecord 对象并设置回调方法。@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 必须在代码中设置主题(setTheme)或者在AndroidManifest中设置主题(android:theme)setTheme(R.style.RecordActivityTheme);setContentView(R.layout.activity_video_record);// 获取UGCKitVideoRecordmUGCKitVideoRecord = (UGCKitVideoRecord) findViewById(R.id.video_record_layout);// 设置录制监听mUGCKitVideoRecord.setOnRecordListener(new IVideoRecordKit.OnRecordListener() {@Overridepublic void onRecordCanceled() {// 录制被取消}@Overridepublic void onRecordCompleted(UGCKitResult result) {// 录制完成回调}});}@Overrideprotected void onStart() {super.onStart();// 判断是否开启了“相机”和“录音权限”(如何判断权限,参考Github/Demo示例)if (hasPermission()) {// UGCKit接管录制的生命周期(关于更多UGCKit接管录制生命周期的方法,参考Github/Demo示例)mUGCKitVideoRecord.start();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (grantResults != null && grantResults[0] == PackageManager.PERMISSION_GRANTED) {mUGCKitVideoRecord.start();}}
效果如下:
![图片描述](https://qcloudimg.tencent-cloud.cn/image/document/7ced3e6477ee730d52e63139fcfcd04b.png)
![图片描述](https://qcloudimg.tencent-cloud.cn/image/document/7ced3e6477ee730d52e63139fcfcd04b.png)
3. 视频导入
3.1 新建 xml,加入如下配置:
<com.tencent.qcloud.ugckit.UGCKitVideoPickerandroid:id="@+id/video_picker"android:layout_width="match_parent"android:layout_height="match_parent" />
3.2 在
res/values/styles.xml
中新建空的主题,继承 UGCKit 默认视频导入主题。<style name="PickerActivityTheme" parent="UGCKitPickerStyle"/>
3.3 新建 activity,继承 Activity,获取 UGCKitVideoPicker 对象,设置对象回调。
@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);// 必须在代码中设置主题(setTheme)或者在AndroidManifest中设置主题(android:theme)setTheme(R.style.PickerActivityTheme);setContentView(R.layout.activity_video_picker);// 获取UGCKitVideoPickermUGCKitVideoPicker = (UGCKitVideoPicker) findViewById(R.id.video_picker);// 设置视频选择监听mUGCKitVideoPicker.setOnPickerListener(new IPickerLayout.OnPickerListener() {@Overridepublic void onPickedList(ArrayList<TCVideoFileInfo> list) {// UGCKit返回选择的视频路径集合}});}
效果如下:
![图片描述](https://qcloudimg.tencent-cloud.cn/image/document/326b93d42a98c175d32e905d9911fb71.png)
![图片描述](https://qcloudimg.tencent-cloud.cn/image/document/326b93d42a98c175d32e905d9911fb71.png)
4. 视频裁剪
4.1 新建 xml ,加入如下配置:
<com.tencent.qcloud.ugckit.UGCKitVideoCutandroid:id="@+id/video_cutter"android:layout_width="match_parent"android:layout_height="match_parent" />
4.2 在
res/values/styles.xml
中新建空的主题,继承 UGCKit 默认编辑主题。<style name="EditerActivityTheme" parent="UGCKitEditerStyle"/>
4.3 新建 Activity ,实现接口
FragmentActivity
,获取 UGCKitVideoCut 对象,并设置回调方法。@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 必须在代码中设置主题(setTheme)或者在AndroidManifest中设置主题(android:theme)setTheme(R.style.EditerActivityTheme);setContentView(R.layout.activity_video_cut);mUGCKitVideoCut = (UGCKitVideoCut) findViewById(R.id.video_cutter);// 获取上一个界面视频导入传过来的视频源路径mVideoPath = getIntent().getStringExtra(UGCKitConstants.VIDEO_PATH);// UGCKit设置视频源路径mUGCKitVideoCut.setVideoPath(mVideoPath);// 设置视频生成的监听mUGCKitVideoCut.setOnCutListener(new IVideoCutKit.OnCutListener() {@Overridepublic void onCutterCompleted(UGCKitResult ugcKitResult) {// 视频裁剪进度条执行完成后调用}@Overridepublic void onCutterCanceled() {// 取消裁剪时被调用}});}@Overrideprotected void onResume() {super.onResume();// UGCKit接管裁剪界面的生命周期(关于更多UGCKit接管裁剪生命周期的方法,参考Github/Demo示例)mUGCKitVideoCut.startPlay();}
效果如下:
![图片描述](https://qcloudimg.tencent-cloud.cn/image/document/ebedb654855dd22b0aa475cfb42754ac.png)
![图片描述](https://qcloudimg.tencent-cloud.cn/image/document/ebedb654855dd22b0aa475cfb42754ac.png)
5. 视频特效编辑
5.1 在编辑 activity 的 xml 中加入如下配置:
<com.tencent.qcloud.ugckit.UGCKitVideoEditandroid:id="@+id/video_edit"android:layout_width="match_parent"android:layout_height="match_parent" />
5.2 新建编辑 Activity ,继承
FragmentActivity
,获取 UGCKitVideoEdit 对象并设置回调方法 。@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 必须在代码中设置主题(setTheme)或者在AndroidManifest中设置主题(android:theme)setTheme(R.style.EditerActivityTheme);setContentView(R.layout.activity_video_editer);// 设置视频源路径(非必须,如果上个界面是裁剪界面,且设置setVideoEditFlag(true)则可以不用设置视频源)mVideoPath = getIntent().getStringExtra(UGCKitConstants.VIDEO_PATH);mUGCKitVideoEdit = (UGCKitVideoEdit) findViewById(R.id.video_edit);if (!TextUtils.isEmpty(mVideoPath)) {mUGCKitVideoEdit.setVideoPath(mVideoPath);}// 初始化播放器mUGCKitVideoEdit.initPlayer();mUGCKitVideoEdit.setOnVideoEditListener(new IVideoEditKit.OnEditListener() {@Overridepublic void onEditCompleted(UGCKitResult ugcKitResult) {// 视频编辑完成}@Overridepublic void onEditCanceled() {}});}@Overrideprotected void onResume() {super.onResume();// UGCKit接管编辑界面的生命周期(关于更多UGCKit接管编辑生命周期的方法,参考Github/Demo示例)mUGCKitVideoEdit.start();}
效果如下:
![图片描述](https://qcloudimg.tencent-cloud.cn/image/document/0fd61aec5e190bf3420d9edee17cdc50.jpeg)
![图片描述](https://qcloudimg.tencent-cloud.cn/image/document/0fd61aec5e190bf3420d9edee17cdc50.jpeg)
详细介绍
以下为各模块的详细说明:
常见问题
是否支持 AndroidX?
UGCKit 最新版本已经使用了AndroidX,如果您使用的还是基于Support包的UGCKit,可以更新到最新版本,也可以按照以下步骤切换到AndroidX:为了方便说明,以腾讯云 UGSVSDK 为例,此 Demo 中同样使用了 UGCKit 模块。
1. 前提准备:
将Android Studio更新至 Android Studio 3.2及以上。
Gradle 插件版本改为 4.6及以上。
![](https://qcloudimg.tencent-cloud.cn/image/document/a45d856cdfa66485cf4ab706b446211a.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/a45d856cdfa66485cf4ab706b446211a.png)
compileSdkVersion 版本升级到 28 及以上。
buildToolsVersion 版本改为 28.0.2 及以上。
![](https://qcloudimg.tencent-cloud.cn/image/document/70e993e454c35ec8308ab93e69b22300.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/70e993e454c35ec8308ab93e69b22300.png)
2. 开启迁移:
2.1 使用 Android Studio 导入项目后,从菜单栏中依次选择 Refactor > Migrate to AndroidX。
![](https://qcloudimg.tencent-cloud.cn/image/document/3e450c20963afd685e33b86c3e56f2af.png)
2.2 单击 Migrate,即可将现有项目迁移到 AndroidX。
![](https://qcloudimg.tencent-cloud.cn/image/document/5116f1bfe35c87be073be724c229b9e2.png)
UGCKit 编译版本错误?
报错信息:
ERROR: Unable to find method 'org.gradle.api.tasks.compile.CompileOptions.setBootClasspath(Ljava/lang/String;)V'.Possible causes for this unexpected error include:
问题原因:UGCKit 使用的 Gradle 插件版本为 2.2.3 ,Gradle版本为 3.3。
解决方法:请检查
Android Studio Gradle
插件版本和 Gradle 版本是否匹配,具体请参见 查看 Gradle 插件对应Gradle版本。UGCKit 包编译时出现报错?
报错信息:
![](https://qcloudimg.tencent-cloud.cn/image/document/8d72d59ab0a8c3cd70783abf845b2db7.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/8d72d59ab0a8c3cd70783abf845b2db7.png)
问题原因:主要是
ugckit module
缺少renderscript-v8.jar
。这个库主要是对图形的处理,模糊,渲染。解决方法:
renderscript-v8.jar
包的目录在\\sdk\\build-tools\\
里,您需在ugckit module
下新建一个 libs 包,然后将 renderscript-v8.jar
加入 libs 包即可。