离线打包一些第三方的SDK, 犹如一名战士穿上铠甲,大大增强了战斗力,让你的APP 功能变得更加强大。
Android Studio 离线打包 阿里云 短视频 SDK 基础版
1.基础版: 只有录制和裁剪功能,
- 标准版:可以修改UI
- 专业版: 很复杂的功能
可以参考,阿里云SDK说明
阿里云短视频基础版
如何没有离线打包过的,可以参考,官方最新的AS 打包教程:
AS 最新离线打包教程
扫一扫下载安卓dome体验
里云的SDK包 QuSdk-RC.aar 复制到 libs/ 目录下,和 armeabi-v7a 文件夹复制到 libs/ 下里面是些os文件。
第二步:添加 阿里云 的依赖,在build.gradle ,文件 dependencies 里添加,
implementation(name: 'QuSdk-RC', ext: 'aar')
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.google.code.findbugs:jsr305:3.0.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'pub.devrel:easypermissions:0.2.1'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
compile 'com.squareup.okio:okio:1.12.0'
compile 'com.google.code.gson:gson:2.8.0'
然后再在 在build.gradle 文件里和 dependencies 同级别 处添加
repositories {
flatDir {
dirs 'libs'
}
}
然后再在 在build.gradle 文件里android 处添加
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir "libs"
}
然后在设置AndroidManifest.xml文件,声明使用权限(必须)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
第三步:以上权限,和SDK 的一些配置,已经配好了,下面进入写代码:
基础版的,代码很少,也简单,目前写两个java文件,一个用于初始化,别一个用于调用录制
要用视频录制,先初始化阿里云 短视频组件,
写了一个 :AliyunServer 类, 然在 dcloud_properties.xml ,services 服务项,添加一行,用于,应用打开时,就执行该文件,用于初始化阿里云 短视频组件
<service name="AliyunServer" value="com.Video.integrate.AliyunServer"/>
基础版,只需要添加这三行就可以。
package com.Video.integrate;
import android.content.Context;
import android.os.Bundle;
import com.aliyun.common.httpfinal.QupaiHttpFinal;
import io.dcloud.common.DHInterface.StandardFeature;
/**
* Created by Administrator on 2018-06-20.
*/
public class AliyunServer extends StandardFeature
{
public void onStart(Context pContext, Bundle pSavedInstanceState, String[] pRuntimeArgs) {
/**
* 如果需要在应用启动时进行初始化,可以继承这个方法,并在properties.xml文件的service节点添加扩展插件的注册即可触发onStart方法
* */
//当应用打开时,初始化,阿里SDK短视频 组件
System.loadLibrary("QuCore-ThirdParty");
System.loadLibrary("QuCore");
QupaiHttpFinal.getInstance().initOkHttpFinal();
}
}
第二步就是:AliyunVideo 类,用于调起录制页面
package com.Video.integrate;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import com.aliyun.demo.recorder.AliyunVideoRecorder;
import com.aliyun.struct.common.CropKey;
import com.aliyun.struct.common.ScaleMode;
import com.aliyun.struct.common.VideoQuality;
import com.aliyun.struct.recorder.CameraType;
import com.aliyun.struct.recorder.FlashType;
import com.aliyun.struct.snap.AliyunSnapVideoParam;
import org.json.JSONException;
import org.json.JSONObject;
public class AliyunVideo extends Activity
{
private static final int REQUEST_CODE_RECORD_VIDEO= 1002;
private int resolutionMode,ratioMode,recordMode,beautyLevel,max,min,gop,minVideoDuration,maxVideoDuration,minCropDuration,frameRate,resulutionMode;
private boolean beautyStatus,needClip,needRecord;
private CameraType cameraType;
private FlashType flashType;
private VideoQuality videoQulity;
private ScaleMode cropMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
Intent intent = this.getIntent();
String datajson= intent.getCharSequenceExtra("datajson").toString();
try {
JSONObject object=new JSONObject(datajson);
String _resolutionMode=object.getString("setResolutionMode");
resolutionMode=onRESOLUTION(_resolutionMode);
String _setRatioMode=object.getString("setRatioMode");
if(_setRatioMode.equals("1/1")){
ratioMode = AliyunSnapVideoParam.RATIO_MODE_1_1;
}else if(_setRatioMode.equals("3/4")){
ratioMode = AliyunSnapVideoParam.RATIO_MODE_3_4;
}else if(_setRatioMode.equals("9/16")){
ratioMode = AliyunSnapVideoParam.RATIO_MODE_9_16;
}
String _setRecordMode=object.getString("setRecordMode").trim().toLowerCase();
if(_setRecordMode.equals("auto")){
recordMode=AliyunSnapVideoParam.RECORD_MODE_AUTO;
}else if(_setRecordMode.equals("press")){
recordMode= AliyunSnapVideoParam.RECORD_MODE_PRESS;
}else if(_setRecordMode.equals("touch")){
recordMode= AliyunSnapVideoParam.RECORD_MODE_TOUCH;
}
beautyLevel=object.getInt("setBeautyLevel");
beautyStatus=object.getBoolean("setBeautyStatus");
String _cameraType=object.getString("setCameraType").trim().toLowerCase();
if(_cameraType.equals("front"))
{
cameraType=CameraType.FRONT;
// Log.i("KPPPPPPPPFGGGGGGGGG", _cameraType);
} else{cameraType=CameraType.BACK;}
String _flashType=object.getString("setFlashType").trim().toLowerCase();
if(_flashType.equals("no")){
flashType=FlashType.ON;
}else if(_flashType.equals("off")){
flashType= FlashType.OFF;
}else if(_flashType.equals("auto")){
flashType= FlashType.AUTO;
}
needClip=object.getBoolean("setNeedClip");
max=object.getInt("setMaxDuration")*1000;
min=object.getInt("setMinDuration")*1000;
String _videoQuality=object.getString("setVideoQuality").trim().toLowerCase();
if(_videoQuality.equals("ld")){
videoQulity = VideoQuality.LD;
}else if(_videoQuality.equals("sd")){
videoQulity = VideoQuality.SD;
}else if(_videoQuality.equals("hd")){
videoQulity = VideoQuality.HD;
}else if(_videoQuality.equals("ssd")){
videoQulity = VideoQuality.SSD;
}
gop=object.getInt("setGop");
minVideoDuration=object.getInt("setMinVideoDuration")*1000;
maxVideoDuration=object.getInt("setMaxVideoDuration")*1000;
minCropDuration=object.getInt("setMinCropDuration")*1000;
frameRate=object.getInt("setFrameRate");
needRecord=object.getBoolean("setNeedRecord");
String _resulutionMode=object.getString("setResulutionMode");
resulutionMode=onRESOLUTION(_resulutionMode);
String _cropMode=object.getString("setCropMode").trim().toLowerCase();
cropMode=(_cropMode.equals("cpu")?ScaleMode.PS:ScaleMode.LB);
} catch (JSONException e){
e.printStackTrace();
}
AliyunSnapVideoParam recordParam=new AliyunSnapVideoParam.Builder()
.setResolutionMode(resolutionMode) //录制 设置录制分辨率,目前支持360p,480p,540p,720p
.setRatioMode(ratioMode) //录制 设置视频比例,目前支持1:1,3:4,9:16
.setRecordMode(recordMode) //录制 设置录制模式,目前支持按录,点录和混合模式
// .setFilterList(eff_dirs) //录制 设置滤镜地址列表,具体滤镜接口接收的是一个滤镜数组
.setBeautyLevel(beautyLevel) //录制 设置美颜度
.setBeautyStatus(beautyStatus) //录制 设置美颜开关
.setCameraType(cameraType) //录制 设置前后置摄像头
.setFlashType(flashType) //录制 设置闪光灯模式
.setNeedClip(needClip) //录制 设置是否需要支持片段录制
.setMaxDuration(max) //录制 设置最大录制时长 单位毫秒
.setMinDuration(min) //录制 设置最小录制时长 单位毫秒
.setVideoQuality(videoQulity) //录制设置视频质量
.setGop(gop) //设置关键帧间隔
// .setVideoBitrate(2000) //录制设置视频码率,如果不设置则使用视频质量videoQulity参数计算出码率
.setMinVideoDuration(minVideoDuration) //裁剪 设置过滤的视频最小长度 单位毫秒
.setMaxVideoDuration(maxVideoDuration) //裁剪 设置过滤的视频最大长度 单位毫秒
.setMinCropDuration(minCropDuration) //裁剪 设置视频最小裁剪时间 单位毫秒
.setFrameRate(frameRate) //裁剪 设置帧率
.setNeedRecord(needRecord)//设置是否需要开放录制入口
.setResulutionMode(resulutionMode) //设置分辨率,目前支持360p,480p,540p,720p
.setCropMode(cropMode) //设置裁剪方式,是否使用gpu进行裁剪,不设置则默认使用cpu来裁剪
.setSortMode(AliyunSnapVideoParam.SORT_MODE_VIDEO) //设置导入相册过滤选择视频
.build();
AliyunVideoRecorder.startRecordForResult(this, REQUEST_CODE_RECORD_VIDEO, recordParam);
}
//分辨率
public int onRESOLUTION(String name)
{
name=name.trim().toLowerCase();
Integer num=0;
if(name.equals("360p"))
{ num= AliyunSnapVideoParam.RESOLUTION_360P;
}else if(name.equals("480p")){
num= AliyunSnapVideoParam.RESOLUTION_480P;
}else if(name.equals("540p")){
num= AliyunSnapVideoParam.RESOLUTION_540P;
}else if(name.equals("720p"))
{
num= AliyunSnapVideoParam.RESOLUTION_720P;
}
return num;
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
Intent intent=new Intent();
if(requestCode ==REQUEST_CODE_RECORD_VIDEO)
{
if(resultCode == Activity.RESULT_OK && data!= null)
{
int type = data.getIntExtra(AliyunVideoRecorder.RESULT_TYPE,0);
if(type == AliyunVideoRecorder.RESULT_TYPE_CROP) //截取视频
{
String path = data.getStringExtra(CropKey.RESULT_KEY_CROP_PATH);
intent.putExtra("resultCode","000000");
intent.putExtra("type","CROP");
intent.putExtra("path",path);
// intent.putExtra("time",data.getLongExtra(CropKey.RESULT_KEY_DURATION,0));
}else if(type == AliyunVideoRecorder.RESULT_TYPE_RECORD) //录制视频
{
String path = data.getStringExtra(AliyunVideoRecorder.OUTPUT_PATH);
intent.putExtra("resultCode","000000");
intent.putExtra("type","RECORD");
intent.putExtra("path",path);
// intent.putExtra("time",data.getLongExtra(AliyunVideoRecorder.R,0));
}
}else if(resultCode == Activity.RESULT_CANCELED)
{
intent.putExtra("resultCode","-1");
}
}
else {intent.putExtra("resultCode","-2");}
setResult(RESULT_OK,intent);
this.finish();
}
}
然后在html 页面 用JS通过 Native.js,调用原生类 ,写了一个,AliyunVideo.js 插件:
//实例化插件
var vide=new AliyunVideo(
{
setResolutionMode:"720p", //录制 设置录制分辨率,目前支持360p,480p,540p,720p
setRatioMode:"1/1", //录制 设置视频比例,目前支持1/1 ,3/4, 9/16
setRecordMode:"AUTO", //录制 设置录制模式,目前支持按录:PRESS,点录:TOUCH和混合模式:AUTO
setBeautyLevel:60, //录制 设置美颜度,1-100,比率
setBeautyStatus:true, //录制 设置美颜开关
setCameraType:"BACK", //录制 设置前后置摄像头, 后:BACK ,前:FRONT
setFlashType:"OFF", //录制 设置闪光灯模式,开:NO, 关:OFF, 自动:AUTO
setNeedClip:true, //录制 设置是否需要支持片段录制
setMaxDuration:15, //录制 设置最大录制时长 单位秒
setMinDuration:2, //录制 设置最小录制时长 单位秒
setVideoQuality:"HD", //录制设置视频质量 4个级别, 低:LD ,中:SD ,高:HD ,极高:SSD
setGop:125, //设置关键帧间隔,建议:1-300之间
setMinVideoDuration:5, //裁剪 设置过滤的视频最小长度 单位秒
setMaxVideoDuration:15, //裁剪 设置过滤的视频最大长度 单位秒
setMinCropDuration:2, //裁剪 设置视频最小裁剪时间 单位毫秒
setFrameRate:25, //裁剪 设置帧率
setNeedRecord:false, //设置是否需要开放录制入口,即选择视频的页面,多出一个录制按钮
setResulutionMode:"540p", //设置裁剪分辨率,目前支持360p,480p,540p,720p
setCropMode:"cpu" //设置裁剪方式,是否使用gpu进行裁剪,不设置则默认使用cpu来裁剪
});
// js 打开录制视频页面
vide.open(function(e)
{
if(e.code=="000000")
{
//录制视频或裁剪视频,成功后,返回视频一个地址
mui.toast("视频地址:"+e.path);
}
else if(e.code=="-1")
{ //用户取消行为
mui.toast("用户已取消");
}
});
下面是AS工程包,因官方上传限制, 不包含阿里云的SDK, 另外下载