meHaoTian
meHaoTian
  • 发布:2019-01-16 10:53
  • 更新:2019-05-24 17:37
  • 阅读:2817

uni-app 拍摄视频限制最大长度解决方案

分类:uni-app

因为uni-app的平台差异问题,所以无法直接限制视频的长度,类似与微信朋友圈拍摄十秒视频。现在提供一种App端可以实现的解决方案。

安卓解决方案

关联阅读
安卓使用njs来实现视频最大播放时长

      // 安卓关键代码  
const VIDEOZOOM = 200;  
let MediaStore = plus.android.importClass('android.provider.MediaStore');  
let Intent = plus.android.importClass('android.content.Intent');  
// 导入后可以使用new方法创建类的示例对象  
let intent = new Intent('android.media.action.VIDEO_CAPTURE');  
intent.putExtra('android.intent.extra.videoQuality', 1); //0 means low quality, 1 means high quality  
//intent.putExtra("android.provider.MediaStore.EXTRA_OUTPUT", url);  
intent.putExtra('android.intent.extra.durationLimit', 10); //设置录像时间  
let main = plus.android.runtimeMainActivity();  
main.startActivityForResult(intent, VIDEOZOOM);  
//获取返回参数  
main.onActivityResult = function(requestCode, resultCode, data) {  
    let context = main;  
    plus.android.importClass(data);  
    let uri = data.getData();  
    let resolver = context.getContentResolver();  
    plus.android.importClass(resolver);  
    let cursor = resolver.query(uri, null, null, null, null);  
    plus.android.importClass(cursor);  
    cursor.moveToFirst();  
    let column = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);  
    // 获取录制的视频路径  
    let filePath = cursor.getString(column);  
    // 解析视频文件的属性  
    plus.io.resolveLocalFileSystemURL(  
        filePath,  
        (entry) => {  
            console.log(entry.fullPath)  
            entry.file(function(file) {  
                 console.log("size=="+file.size);   
                 console.log("name=="+file.name);  
            });  
        },  
        (e) => {  
            console.log("Resolve file URL failed: " + e.message);  
        }  
    );  
};  

ios解决方案

关联阅读
ios 直接使用5+ Api 就可以实现相关功能

       // ios关键代码  

let cmr = plus.camera.getCamera();  
let res = cmr.supportedVideoResolutions[0];  
let fmt = cmr.supportedVideoFormats[0];  
cmr.startVideoCapture(  
    function(path) {  
        plus.io.resolveLocalFileSystemURL(  
            path,  
            (entry) => {  
                console.log(entry.fullPath)  
                entry.file(function(file) {  
                  console.log("size=="+file.size);   
                  console.log("name=="+file.name);  
                });  
            },  
            (e) => {}  
        );  
    },  
    function(error) {  
        console.log("Resolve file URL failed: " + e.message);  
    }, {  
        resolution: res,  
        format: fmt,  
        videoMaximumDuration:10  
    }  
);  

Tips

  • 安卓端使用njs,因为不同root的问题会有部分手机不支持

具体使用

详见附件,把代码进行简单整合,并判断平台 ,可以直接调用

video.camera({  
    time: 10,  
    success: e => {  
        console.log("path=="+e.fullPath);   
        console.log("size=="+e.file.size);   
        console.log("name=="+e.file.name);  
        console.log(e);  
    }  
});  
3 关注 分享
Trust ___K yishengheqiu1992@163.com

要回复文章请先登录注册

YNNNNNN

YNNNNNN

回复 Neil_HL:
大佬,ios预览的时候报错啊 [ERROR] : thirdScriptError
2019-05-24 17:37
YNNNNNN

YNNNNNN

回复 YNNNNNN:
ios不能预览播放录制的视频。。
2019-05-24 17:04
YNNNNNN

YNNNNNN

ios的录制完后不能重新预览,原因是录制完成后并没有保存到本地路径,给的归档demo有这个问题
2019-05-24 16:57
704179838@qq.com

704179838@qq.com

用这个方法如果报错应该是没获取到摄像头权限,调试功能可以手动设置一下,获取权限的代码上面的朋友有发。
2019-05-20 15:07
DCloud_Android_TRY

DCloud_Android_TRY

njs中plus.android.requestPermissions方法可以用于android权限申请。
针对此处拍摄视频前的相机权限申请,以下代码可供参考。

```javascript
plus.android.requestPermissions(
["android.permission.CAMERA"],
(s)=>{
var resultObj = s;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
console.log('granted结果:'+ grantedPermission);

// 拍摄视频代码

}
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
var grantedPermission = resultObj.deniedPresent[i];
console.log('deniedPresent结果:'+ grantedPermission);
}
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
var grantedPermission = resultObj.deniedAlways[i];
console.log('deniedAlways结果:'+ grantedPermission);
}
// 若所需权限被永久拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
if (resultObj.deniedAlways.length > 0) {
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
},
(e)=>{
console.log('申请失败:'+ e.code+ " "+ e.message+ " "+ e.result);
}
);
```
2019-05-15 12:03
394642365@qq.com

394642365@qq.com

回复 jack_zheng:
怎么判断是否有权限,怎么请求权限
2019-05-14 13:08
jack_zheng

jack_zheng

回复 394642365@qq.com:
按照你的提示,我找到手机应用管理页面,手动给我的APP 开通相机权限,确实正常的。 那应该可以打开APP 的时候,判断摄像头权限,提示用户开启摄像头权限才能拍摄,这应该是一种解决办法。
2019-05-11 15:49
394642365@qq.com

394642365@qq.com

回复 394642365@qq.com:
调用这个的时候没有主动请求权限
2019-05-11 14:38
394642365@qq.com

394642365@qq.com

回复 jack_zheng:
现在知道报这个错是什么原因了,main.startActivityForResult(intent, VIDEOZOOM);调用这个的时候,没有摄像头的权限,但是又不知道怎么获取权限
2019-05-11 14:38
jack_zheng

jack_zheng

回复 394642365@qq.com:
出现同样问题,之前是不报错的
2019-05-10 19:47