更新记录

1.0.1(2024-01-27)

  • 优化module无预览拍照

1.0.0(2024-01-15)

  • 新版发布

平台兼容性

Android Android CPU类型 iOS
适用版本区间:5.0 - 14.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


特别提醒

  • 购买本插件前,请先试用,请先试用,请先试用自测确认满足需求之后再行购买。虚拟物品一旦购买之后无法退款;
  • 如有使用上的疑问、bug,可以QQ(381996687)联系作者;
  • 作者可承接各种插件定制,价格美丽有意向可加q详谈;
  • 请在合法范围内使用,若使用本插件做非法开发,本方概不负责;
  • 请仔细阅读文档结合示例demo测试有问题加q联系作者;

插件功能介绍

Android端无预览拍照、录制、预览拍照/录制 (无预览录制与预览拍照/录制仅nvue中有效)

  1. vue页面无预览拍照(可设置前后摄像头);
  2. nvue页面预览拍照/录制、无预览拍照/录制;
  3. 本插件可通过module与component的方式引用;
  4. vue页面中的无预览拍照通过module的方式引入,nvue页面可通过module/component方式引入(module只支持拍照)
  5. 删除指定图片

使用方法

nvue中无预览拍照/录制、预览拍照/录制

<yt-noPreviewCapture ref="noPriviewCapture" style="width: 1rpx;height: 1rpx;background-color: blue;" mode="PICTURE"></yt-noPreviewCapture>

说明:无预览拍照width与height不能设为0,(宽高都设为0会全屏显示预览)设置为1rpx,需要预览抓拍可自行设置width与height。mode可设为VIDEO:视频录制 PICTURE:拍照(默认)。

//需在onShow中调用openCameraView(),否则从下个页面回到当前页面无法继续拍照或录制
onShow() {
    this.$refs.noPriviewCapture.openCameraView();
},
onHide() {
   this.$refs.noPriviewCapture.closeCamera();
},
  • 拍照
// 抓拍图片存放路径
var path = plus.io.convertLocalFileSystemURL("_doc/NoPriviewCapture");
let time = new Date().getTime();
var name = time + ".jpg"
let dic = {
    filePath: path,
    fileName: name
}
this.$refs.noPriviewCapture.takePicture(dic, res => {
    if (res.code == 200) {
        this.resultPicture = path + "/" + name;
        // this.resultPicture = res.path;
    } else {
        uni.showToast({
            title: res.msg,
            icon: 'none',
            duration: 1500
        })
    }
});
  • 录制
var path = plus.io.convertLocalFileSystemURL("_doc/NoPriviewVideo");
let time = new Date().getTime();
var name = time + ".mp4"
let dic = {
    filePath: path,
    fileName: name,
    duration:5//录制时长默认60秒
}
this.$refs.noPriviewCapture.takeRecordVideo(dic, res => {
    if (res.code == 200) {
        this.videoPath = res.path
        console.log(res.path)
    } else {
        uni.showToast({
            title: res.msg,
            icon: 'none',
            duration: 1500
        })
    }
});
  • 停止录制
this.$refs.noPriviewCapture.stopTakeVideo();
  • 删除指定路径下资源
let path = this.resultPicture;
this.$refs.noPriviewCapture.deleteFile(path, res => {
    uni.showToast({
        title: res.deleteResult == true ? "清除成功" : "清除失败",
        icon: 'none',
        duration: 1500
    })
});
  • 切换摄像头
this.$refs.noPriviewCapture.switchCamera();

vue页面使用无预览拍照(nvue中也可通过该方式实现无预览拍照)

引入插件

const noPriViewModule = uni.requireNativePlugin('YT-NoPriview');
  • 使用
//获取摄像头支持的输出图片的分辨率
noPriViewModule.getPictureSize({
                    facing: index == 1 ? "FRONT" : "BACK" //BACK:后置摄像头   FRONT:前置 默认前置
                }, res => {
                    this.pictureSize = res.join(',');
                })
var path = plus.io.convertLocalFileSystemURL("_doc/NoPriviewCapture");
                let time = new Date().getTime();
                var name = time + ".jpg"
                let dic = {
                    filePath: path, //存图片路径
                    fileName: name, //图片名称
                    facing: "FRONT", //BACK:后置摄像头   FRONT:前置 默认前置
                    isFocus: false,//是否聚焦
                    sise: {//输出图片的分辨率(先填),先通过getPictureSize获取摄像头支持的输出分辨率(必须是摄像头支持的输出分辨率)
                        width: 800,
                        height: 600
                    }
                }
                noPriViewModule.takePicture(dic, res => {
                    this.path = res.path;
                    console.log(res.path);
                    uni.saveImageToPhotosAlbum({
                        filePath: res.path,
                        success: (ee) => {

                        }
                    })
                })
  • 删除指定图片
noPriViewModule.deletePath(this.path, res => {
                    uni.showToast({
                        title: res.deleteResult == true ? "清除成功" : "清除失败",
                        icon: 'none',
                        duration: 1500
                    })
                });

component完整示例

<template>
    <view class="content">
        <ly-noPreviewCapture ref="noPriviewCapture" style="width: 1rpx;height: 1rpx;background-color: blue;" mode="PICTURE"></ly-noPreviewCapture>
        <button class="btn" @click="takePicture()">拍照</button>
        <button class="btn" @click="takeVideo()" style="margin-top: 30rpx;">录制</button>
        <button class="btn" @click="stopTakeVideo()" style="margin-top: 30rpx;">停止录制</button>
        <button class="btn" @click="deletePath()" style="margin-top: 30rpx;">删除</button>
        <button class="btn" @click="switchCamera()" style="margin-top: 30rpx;">切换摄像头</button>
        <text style="margin-top: 30rpx;">拍照结果</text>
        <image :src="resultPicture" style="width: 750rpx;height: 400rpx;margin-top: 40rpx;"></image>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                resultPicture: '',
                videoPath: '',
                mode:"PICTURE"//VIDEO:视频录制  PICTURE:拍照(默认)
            }
        },
        onShow() {
            this.$refs.noPriviewCapture.openCameraView();
        },
        onHide() {
            this.$refs.noPriviewCapture.closeCamera();
        },
        methods: {

            takePicture() {
                // 抓拍图片存放路径
                var path = plus.io.convertLocalFileSystemURL("_doc/NoPriviewCapture");
                let time = new Date().getTime();
                var name = time + ".jpg"
                let dic = {
                    filePath: path,
                    fileName: name
                }
                this.$refs.noPriviewCapture.takePicture(dic, res => {
                    if (res.code == 200) {
                        this.resultPicture = path + "/" + name;
                        // this.resultPicture = res.path;
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                            duration: 1500
                        })
                    }
                });
            },
            // 录制
            takeVideo() {
                var path = plus.io.convertLocalFileSystemURL("_doc/NoPriviewVideo");
                let time = new Date().getTime();
                var name = time + ".mp4"
                let dic = {
                    filePath: path,
                    fileName: name,
                    duration:5//录制时长默认60秒
                }
                this.$refs.noPriviewCapture.takeRecordVideo(dic, res => {
                    if (res.code == 200) {
                        this.videoPath = res.path
                        console.log(res.path)
                    } else {
                        uni.showToast({
                            title: res.msg,
                            icon: 'none',
                            duration: 1500
                        })
                    }
                });
            },
            //停止录制
            stopTakeVideo() {
                this.$refs.noPriviewCapture.stopTakeVideo();
            },
            //删除指定路径下资源
            deletePath() {
                if (this.resultPicture == "") {
                    uni.showToast({
                        title: "路径为空",
                        icon: 'none',
                        duration: 1500
                    })
                    return;
                }
                this.$refs.noPriviewCapture.deleteFile(this.resultPicture, res => {
                    uni.showToast({
                        title: res.deleteResult == true ? "清除成功" : "清除失败",
                        icon: 'none',
                        duration: 1500
                    })
                });
            },
            // 切换摄像头
            switchCamera(){
                this.$refs.noPriviewCapture.switchCamera();
            }
        }
    }
</script>

<style>
    .content {
        display: flex;
        position: relative;
        width: 750rpx;
        flex: 1;
        background-color: aqua;
    }

    .btn {
        margin-top: 20rpx;
        width: 680rpx;
        margin-left: 35rpx;
        height: 60rpx;
        background-color: antiquewhite;
    }
</style>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

"<uses-permission android:name=\"android.permission.CAMERA\"/>", "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>", "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>", "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>", "<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>", "<uses-permission android:name=\"android.permission.SYSTEM_OVERLAY_WINDOW\"/>"

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问