uniapp使用安卓设备拍照并上传

需求:使用uniapp开发的安卓软件需要调用非官方的安卓设备摄像头进行拍照
实现:使用uniapp的live-pusher
代码:

          <button class="button1" @click="catchPhoto()">
              <span style="color: #fff;">拍照</span>
          </button>

          catchPhoto() {
              this.$Router.push({path:'/pages/camera/camera'})
          },
           //设置图片
          setImage(e) {
            console.log(e);
            //显示在页面
            //this.imagesrc = e.path;
                this.savePhoto(e.path);
                this.chooseAndUploadImage(e.path)
          },
          //保存图片到相册,方便核查
          savePhoto(path){
            this.imagesrc = path;
            //保存到相册
            uni.saveImageToPhotosAlbum({
                filePath: path,
                success: () => {
                    uni.showToast({
                        title: this.imagesrc,
                        duration: 2000
                    });
                }
            });
          },
          chooseAndUploadImage() {
              // 调用uni.uploadFile将文件上传至服务器
              const that=this
              uni.uploadFile({
                url:'https://scalpsentry-release.siyuhome.net/sys/common/upload', // 设置上传接口地址
                filePath: e.tempFiles[0].path, // 需要上传的文件路径
                name: 'file', // 后台接收文件时对应的字段名称
                header: {
                    // "Content-Type": "multipart/form-data",
                },
                success(response) {
                    // TODO: 处理上传成功后的操作
                    console.log('文件上传成功');
                    console.log(response);
                    const data = JSON.parse(response.data)
                    
                    return
                },
                fail(error) {
                    console.log('文件上传失败');
                    console.log(error);
                
                    // TODO: 处理上传失败后的操作
                }
              });
              },

新建/pages/camera/camera.nvue文件
代码如下:

<template>
    <view class="live-camera" :style="{ width: windowWidth, height: windowHeight }">
        <live-pusher
            id="livePusher"
            ref="livePusher"
            class="livePusher"
            mode="FHD"
            beauty="0"
            whiteness="0"
            :aspect="aspect"
            min-bitrate="1000"
            audio-quality="16KHz"
            device-position="back"
            :auto-focus="true"
            :muted="true"
            :enable-camera="true"
            :enable-mic="false"
            :zoom="false"
            @statechange="statechange"
            :style="{ width: windowWidth, height: windowHeight }"
        ></live-pusher>

        <view class="menu">
            <!--底部菜单区域背景-->
            <cover-image class="menu-mask" src="/static/live-camera/bar.png"></cover-image>

            <!--返回键-->
            <cover-image class="menu-back" @tap="back" src="/static/live-camera/back.png"></cover-image>

            <!--快门键-->
            <cover-image class="menu-snapshot" @tap="snapshot" src="/static/live-camera/shutter.png"></cover-image>

            <!--反转键-->
            <cover-image class="menu-flip" @tap="flip" src="/static/live-camera/flip.png"></cover-image>
        </view>
    </view>
</template>

<script>
let _this = null;
export default {
    data() {
        return {
            poenCarmeInterval:null,//打开相机的轮询
            aspect: '2:3', //比例
            windowWidth: '', //屏幕可用宽度
            windowHeight: '', //屏幕可用高度
            camerastate: false, //相机准备好了
            livePusher: null, //流视频对象
            snapshotsrc: null //快照
        };
    },
    onLoad(e) {
        _this = this;
        this.initCamera();
    },
    onReady() {
        this.livePusher = uni.createLivePusherContext('livePusher', this);
        this.startPreview(); //开启预览并设置摄像头
        this.poenCarme();
    },
    methods: {
        
        //轮询打开
        poenCarme(){
            //#ifdef APP-PLUS
            if (plus.os.name == 'Android') {
                this.poenCarmeInterval = setInterval(function() {
                    console.log(_this.camerastate);
                    if (!_this.camerastate) _this.startPreview();
                }, 2500);
            }
            //#endif
        },
        //初始化相机
        initCamera() {
            uni.getSystemInfo({
                success: function(res) {
                    _this.windowWidth = res.windowWidth;
                    _this.windowHeight = res.windowHeight;
                    let zcs = _this.aliquot(_this.windowWidth,_this.windowHeight);
                    _this.aspect = (_this.windowWidth/zcs)+':'+(_this.windowHeight/zcs);
                    console.log('画面比例:'+_this.aspect);
                }
            });
        },
        
        //整除数计算
        aliquot(x, y) {
            if (x % y == 0) return y;
            return this.aliquot(y, x % y);
        },

        //开始预览
        startPreview() {
            this.livePusher.startPreview({
                success: a => {
                    console.log(a)
                }
            });
        },
        
        //停止预览
        stopPreview() {
            this.livePusher.stopPreview({
                success: a => {
                    _this.camerastate = false; //标记相机未启动
                }
            });
        },
        
        //状态
        statechange(e) {
            //状态改变
            console.log(e);
            if (e.detail.code == 1007) {
                _this.camerastate = true;
            } else if (e.detail.code == -1301) {
                _this.camerastate = false;
            }
        },
        

        //返回
        back() {
            uni.navigateBack();
        },

        //抓拍
        snapshot() {
            //震动
            uni.vibrateShort({
                success: function () {
                    console.log('success');
                }
            });
            //拍照
            this.livePusher.snapshot({
                success: e => {
                    _this.snapshotsrc = e.message.tempImagePath;
                    _this.stopPreview();
                    _this.setImage();
                    uni.navigateBack();
                }
            });
        },

        //反转
        flip() {
            this.livePusher.switchCamera();
        },

        //设置
        setImage() {
            let pages = getCurrentPages();
            let prevPage = pages[pages.length - 2]; //上一个页面

            //直接调用上一个页面的setImage()方法,把数据存到上一个页面中去
            prevPage.$vm.setImage({ path: _this.snapshotsrc });
        }
    }
};
</script>

<style lang="scss">
.live-camera {
    justify-content: center;
    align-items: center;
    .menu {
        position: absolute;
        left: 0;
        bottom: 0;
        width: 750rpx;
        height: 180rpx;
        z-index: 98;
        align-items: center;
        justify-content: center;
        .menu-mask {
            position: absolute;
            left: 0;
            bottom: 0;
            width: 750rpx;
            height: 180rpx;
            z-index: 98;
        }
        .menu-back {
            position: absolute;
            left: 30rpx;
            bottom: 50rpx;
            width: 80rpx;
            height: 80rpx;
            z-index: 99;
            align-items: center;
            justify-content: center;
        }
        .menu-snapshot {
            width: 130rpx;
            height: 130rpx;
            z-index: 99;
        }
        .menu-flip {
            position: absolute;
            right: 30rpx;
            bottom: 50rpx;
            width: 80rpx;
            height: 80rpx;
            z-index: 99;
            align-items: center;
            justify-content: center;
        }
    }
}
</style>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容