需求为本地选择视频文件,然后上传到腾讯COS

工具:AndroidStudio、HBuilder X、XCode

Android

1.uniapp中处理

(1)主要使用了plugin.js与原生交互,common中新建plugin.js类,调用java方法为uploadFileCOS,源码如下:

! function(root, factory) {  
if (typeof exports == 'object' && typeof module != 'undefined') {  
    module.exports = factory()  
} else if (typeof define == 'function' && define.amd) {  
    define(factory)  
} else {  
    document.addEventListener('plusready', function(){  
    // 修改此处为插件命名  注释---1
    var moduleName = 'elitetyc';   
    
    root.plus[moduleName] = factory()  
    },false);  
}  
}(this, function() {  
var _BARCODE = 'elitetyc';  
var plugintest = {  
    /**
     * 上传文件到COS
     * @param string pathstr 本地文件绝对路径
     * @param string cosPath 在cos中路径,带后缀
     * @param successCallback 成功回调
     * @param errorCallback  失败回调
     */
    uploadFileCOS: function(pathstr,cosPath,successCallback, errorCallback) {
        var success = typeof successCallback !== 'function' ? null : function(args) {
                successCallback(args);
            },
            fail = typeof errorCallback !== 'function' ? null : function(code) {
                errorCallback(code);
            };
        var callbackID = plus.bridge.callbackId(success, fail);
        return plus.bridge.exec(_BARCODE, "uploadFileCOS", [callbackID,pathstr,cosPath]);
    }
};  
return plugintest;  
});  

(2)vue中逻辑处理

/**
 * 选择视频
 */
chooseVideo: function() {
    var _this = this
    _this.tempFilePath = null;//本地视频路径
    uni.chooseVideo({
        count: 1,
        maxDuration: _this.time,
        compressed: false,
        success: function(res) {
            if (res.duration > _this.time+1) {
                return _main.showError('视频不能大于' + _this.time +'秒,请重新选择!');
            }
            var p = plus.io.convertLocalFileSystemURL(_this.tempFilePath);//将本地视频路径转化为绝对路径
            return _this.uploadFileCOS(p);//执行上传
        }
    });
},

/* 上传文件 */
uploadFileCOS(path){
    //srcPath 这里定义固定的mp4,正常线上需要根据选择视频类型将其他格式转化为mp4,否则上传后会被强制改后缀,导致解析不了
    var srcPath = '123.mp4';
    //this.plugins引用的plugin.js
    this.plugins.uploadFileCOS(
        path,
        srcPath,
        function(result) {
            _this.show = false
            if (result == 'ok') {
                                //上传成功,做后续处理
                return _this.addsmallvideo(cospath);
            }
            _main.showError('上传失败,网络不稳定');
        },
        function(result) {
            _this.show = false
            _main.showError('上传失败');
        }
    );
},

至此js端处理完毕

2.java处理上传

用到腾讯云对象储存Android SDK,文档链接:https://cloud.tencent.com/document/product/436/12159

(1)下载uniapp官方提供的原生打包工程,使用HBuilder-Hello
(2)接入sdk,build.gradle 文件中添加如下依赖

dependencies {
    ...
    // 增加这行
    implementation 'com.tencent.qcloud:cosxml:5.5.5'
}

(3)初始化sdk获取永久密钥,新建类MySessionCredentialProvider.java,源码如下

package com.cos;

import android.content.Context;

import com.tencent.cos.xml.CosXmlService;
import com.tencent.cos.xml.CosXmlServiceConfig;
import com.tencent.qcloud.core.auth.QCloudCredentialProvider;
import com.tencent.qcloud.core.auth.ShortTimeCredentialProvider;

public class MySessionCredentialProvider{

    public CosXmlService QCloudLifecycleCredentials(Context context){

        String secretId = "AKIDDEzWoqX8PQEm59SVdhW4MPCiz4tRLDG9"; //永久密钥 secretId
        String secretKey = "QaYHl12oLdiY9VcVAaliQt7AzZu0rURS"; //永久密钥 secretKey
        // 存储桶所在地域简称,例如广州地区是 ap-guangzhou
        String region = "ap-beijing-1";

        // keyDuration 为请求中的密钥有效期,单位为秒
        QCloudCredentialProvider myCredentialProvider =
                new ShortTimeCredentialProvider(secretId, secretKey, 300);

        // 创建 CosXmlServiceConfig 对象,根据需要修改默认的配置参数
        CosXmlServiceConfig serviceConfig = new CosXmlServiceConfig.Builder()
                .setRegion(region)
                .isHttps(true) // 使用 HTTPS 请求, 默认为 HTTP 请求
                .builder();

        // 初始化 COS Service,获取实例
        return  new CosXmlService(context,
                serviceConfig, myCredentialProvider);

    }
}

(4)新建ElitetycPluginTest.java类,用于上传文件、与层交互,源码如下

package com.daliao.daliaovideo;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;

import org.json.JSONArray;
import android.util.Log;

import com.cos.MySessionCredentialProvider;

import com.tencent.cos.xml.CosXmlService;
import com.tencent.cos.xml.exception.CosXmlClientException;
import com.tencent.cos.xml.exception.CosXmlServiceException;
import com.tencent.cos.xml.listener.CosXmlProgressListener;
import com.tencent.cos.xml.listener.CosXmlResultListener;
import com.tencent.cos.xml.model.CosXmlRequest;
import com.tencent.cos.xml.model.CosXmlResult;
import com.tencent.cos.xml.transfer.COSXMLUploadTask;
import com.tencent.cos.xml.transfer.TransferConfig;
import com.tencent.cos.xml.transfer.TransferManager;
import com.tencent.cos.xml.transfer.TransferState;
import com.tencent.cos.xml.transfer.TransferStateListener;

public class ElitetycPluginTest extends StandardFeature {

    String TAG = "VideoApi";

    /*  上传到cos  srart*/
    /**
     * 定义一个方法 将自己的名字加上数字进行返回
     *
     * @param pWebview
     * @param array
     */
    public void uploadFileCOS(IWebview pWebview, JSONArray array) {
        // 获取回调ID
        String CallBackID = array.optString(0);
        Log.e(TAG, "cosPath--"+array.optString(2));

        /* 初始化sdk */
        CosXmlService cosXmlService = new MySessionCredentialProvider().QCloudLifecycleCredentials(pWebview.getContext());
        TransferConfig transferConfig = new TransferConfig.Builder().build();
        TransferManager transferManager = new TransferManager(cosXmlService,
                transferConfig);
        String bucket = "zb-1253570875"; //存储桶,格式:BucketName-APPID
        String cosPath = array.optString(2); //对象在存储桶中的位置标识符,即称对象键
        String srcPath = array.optString(1);; //本地文件的绝对路径
        String uploadId = null;

        // 上传文件
        COSXMLUploadTask cosxmlUploadTask = transferManager.upload(bucket, cosPath,
                srcPath, uploadId);

//设置上传进度回调
        cosxmlUploadTask.setCosXmlProgressListener(new CosXmlProgressListener() {
            @Override
            public void onProgress(long complete, long target) {
                // todo Do something to update progress...
                Log.e(TAG, "onProgress--"+target);
            }
        });
        //设置返回结果回调
        cosxmlUploadTask.setCosXmlResultListener(new CosXmlResultListener() {
            @Override
            public void onSuccess(CosXmlRequest request, CosXmlResult result) {
                COSXMLUploadTask.COSXMLUploadTaskResult cOSXMLUploadTaskResult =
                        (COSXMLUploadTask.COSXMLUploadTaskResult) result;

                Log.e(TAG, "setCosXmlResultListener--成功");
                String _srcPath = "ok";
                JSUtil.execCallback(pWebview, CallBackID, _srcPath, JSUtil.OK, false);

            }

            @Override
            public void onFail(CosXmlRequest request,
                               CosXmlClientException clientException,
                               CosXmlServiceException serviceException) {
                if (clientException != null) {
                    clientException.printStackTrace();
                } else {
                    serviceException.printStackTrace();
                }

                Log.e(TAG, "setCosXmlResultListener--失败");
                String _srcPath = "no";
                JSUtil.execCallback(pWebview, CallBackID, _srcPath, JSUtil.OK, false);
            }
        });
        //设置任务状态回调, 可以查看任务过程
        cosxmlUploadTask.setTransferStateListener(new TransferStateListener() {
            @Override
            public void onStateChanged(TransferState state) {
                // todo notify transfer state
            }
        });
    }
}

(5)dcloud_properties.xml中需要添加自己的插件扩展

<feature name="elitetyc" value="com.daliao.daliaovideo.ElitetycPluginTest"/>

至此上传结束,如需上传进度等参数自行回调

IOS

1.未完待续

点赞(2)

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

返回
顶部