最近在ReactNative接入阿里云視頻SDK,期間遇到不少坑,其中大部分都是由于阿里的demo存在一些問(wèn)題,定位到錯(cuò)誤解決之后總算接好。功能包括視頻錄制、視頻上傳、視頻播放,可以去官網(wǎng)下載看看。
總體的步驟如下:
1、下載demo:
https://help.aliyun.com/document_detail/51992.html?spm=a2c4g.11186623.6.947.17f176058zSLck
2、參考工程配置教程:
https://help.aliyun.com/document_detail/94451.html?spm=a2c4g.11186623.6.1011.396717ebgDtYpp
主要步驟如下:
- 導(dǎo)入模塊AliyunSdk-RCE.aar(基礎(chǔ)版是AliyunSdk-RC.aar)
- 導(dǎo)入so文件,配置build.gradle(app)
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir "src/main/libs"
} - 拷貝thirdparty-lib文件夾到android目錄下,并在build.gradle(project)添加以下代碼:
apply from: 'thirdparty-lib/config.gradle'
maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }
整體配置如下:
buildscript {
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }
google()
}
apply from: 'thirdparty-lib/config.gradle'
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
mavenLocal()
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
maven {
url 'https://maven.google.com/'
name 'Google'
}
maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }
flatDir { dirs 'src/main/libs' }
}
}
ext {
buildToolsVersion = "26.0.3"
minSdkVersion = 18
compileSdkVersion = 26
targetSdkVersion = 26
supportLibVersion = "26.1.0"
}
- AndroidManifest.xml添加權(quán)限及以下兩個(gè)屬性:
android:allowBackup="true"
android:supportsRtl="true"
- 從demo的代碼中導(dǎo)入所需要的模塊(編譯可能報(bào)錯(cuò),因?yàn)楸镜氐腁S環(huán)境可能不一樣,這個(gè)按提示即可解決),然后添加好依賴。根據(jù)demo中的依賴庫(kù)按需添加進(jìn)自己的項(xiàng)目中,如下:
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':AliyunSnap:snap_demo')
compile project(':AliyunResample')
implementation externalAndroidAppCompatV7ToSnapSvideo
implementation externalAndroidSupportV4
implementation externalAndroidRecyclerView
implementation externalGSON
implementation externalOKHTTP
implementation externalAndroidMultiDex
implementation('com.aliyun.ams:alicloud-android-ha-adapter:1.1.0.6.2-open@aar') {
transitive=true
}
implementation('com.aliyun.ams:alicloud-android-ha-ut-analytics:1.1.0.1-open@aar') {
transitive=true
}
- 在app的Application文件中加載動(dòng)態(tài)鏈接庫(kù)、初始化一些SDK
到此基本配置結(jié)束??傮w來(lái)說(shuō),demo的配置可以做參考,但可能跟你本地編譯環(huán)境不同,要稍作修改。 - 如果你還要接入阿里云的上傳SDK,需要去下載,鏈接如下:
上傳SDK:https://help.aliyun.com/document_detail/100490.html?spm=a2c4g.11186623.6.974.e2de17ebMLROPG
基礎(chǔ)版集成上傳功能,首先要跟應(yīng)用服務(wù)器獲取上傳憑證和地址,然后再調(diào)用阿里的SDK上傳。
原生封裝給reactnative端用的上傳方法如下:
@ReactMethod
public void upload(final String uploadAddress, final String uploadAuth,String videoId,String imageUri, final String fileName, final Promise promise) {
Log.i(Tag, "成功獲取憑證 ------------------" + "uploadAuth==" + uploadAuth + "\n" + uploadAddress);
Log.i(Tag, "地址fileName ------------------" + fileName);
promiseVideoUploadResult = promise;
OSSLog.enableLog();
// 上傳視頻
final VODUploadClient uploader = new VODUploadClientImpl(getCurrentContext());
uploader.setRegion(VOD_REGION);
uploader.setRecordUploadProgressEnabled(VOD_RECORD_UPLOAD_PROGRESS_ENABLED);
VODUploadCallback callback = new VODUploadCallback() {
public void onUploadSucceed(UploadFileInfo info) {
Log.i(Tag, "onsucceed ------------------" + info.getFilePath());
Toast.makeText(getCurrentActivity(), "視頻上傳成功", Toast.LENGTH_SHORT).show();
WritableMap object = Arguments.createMap();
object.putString("videoUri", info.getFilePath());
promiseVideoUploadResult.resolve(object);
}
public void onUploadFailed(UploadFileInfo info, String code, String message) {
Log.i(Tag, "onfailed ------------------ " + info.getFilePath() + "code=" + code + "message=" + message);
Toast.makeText(getCurrentActivity(), "視頻上傳失敗", Toast.LENGTH_SHORT).show();
WritableMap object = Arguments.createMap();
object.putString("Errormsg", message);
promiseVideoUploadResult.resolve(object);
}
public void onUploadProgress(UploadFileInfo info, long uploadedSize, long totalSize) {
Log.i(Tag, "onProgress ------------------ " + info.getFilePath() + " " + uploadedSize + " " + totalSize);
Log.i(Tag, "onProgress ------------------ " + uploadedSize * 100 / totalSize);
}
public void onUploadTokenExpired() {
Log.i(Tag, "onExpired ------------- ");
uploader.resumeWithAuth(uploadAuth);
}
public void onUploadRetry(String code, String message) {
Log.i(Tag, "onUploadRetry ------------- ");
}
public void onUploadRetryResume() {
Log.i(Tag, "onUploadRetryResume ------------- ");
}
public void onUploadStarted(UploadFileInfo uploadFileInfo) {
Log.i(Tag, "onUploadStarted ------------- ");
if (isVodMode(uploadAuth)) {
uploader.setUploadAuthAndAddress(uploadFileInfo, uploadAuth, uploadAddress);
}
Log.i(Tag, "file path:" + uploadFileInfo.getFilePath() +
", endpoint: " + uploadFileInfo.getEndpoint() +
", bucket:" + uploadFileInfo.getBucket() +
", object:" + uploadFileInfo.getObject() +
", status:" + uploadFileInfo.getStatus());
}
};
//初始化
uploader.init(callback);
uploader.setPartSize(1024 * 1024);
uploader.setTemplateGroupId("xxx");
uploader.setStorageLocation("xxx");
//添加文件
uploader.addFile(fileName, getVodInfo());
//開(kāi)始上傳
uploader.start();
}
- 對(duì)于視頻播放,有幾種方式,可以參考:
https://help.aliyun.com/document_detail/61910.html?spm=a2c4g.11186623.2.25.47e31fc1E7cKva#h2-5-3-12
3、踩坑總結(jié):
看著步驟好像挺簡(jiǎn)單的,其實(shí)過(guò)程中有不少的坑,總結(jié)如下:
- 報(bào)錯(cuò):aapt.exe finished with non-zero exit value 1
推薦解決方案: https://blog.csdn.net/qq_24118527/article/details/83586161 - 報(bào)錯(cuò):Process 'command 'D:\DevelopTools\Java\jdk1.8.0_144\bin\java.exe'' finished with non-zero exit value 3
推薦解決方案:https://blog.csdn.net/guquan12315/article/details/76608583 - No resource found that matches the given name
推薦解決方案:https://blog.csdn.net/framic/article/details/53939970 - Manifest merger failed : Attribute application@label value=(@string/app_name)
推薦解決方案:
https://blog.csdn.net/dodod2012/article/details/78982708