vue实现调用摄像头扫描二维码

安装依赖:vue-qrcode-reader

npm install vue-qrcode-reader -s

直接上代码

<template>
    <div>
      <div class="qrcodebox fixcenter">   
        <qrcode-stream 
              :camera="camera"
               @decode="onDecode" 
               @init="onInit">
              <div class="qr-scanner">
                  <div class="box">
                      <div class="line"></div>
                      <div class="angle"></div>
                  </div>
                  <div class="txt">
                      扫描二维码
                  </div>
              </div>
        </qrcode-stream>
      </div>
    </div>
  </template>
  
  <script>
  import { QrcodeStream } from 'vue-qrcode-reader'
  
  export default {
  
    components: { QrcodeStream },
  
    data () {
      return {
        camera: 'auto',
        result: null,
      }
    },
  
    computed: {
    },
  
    methods: {
      onInit (promise) {
        promise
          .catch(console.error)
          .then(() => {
            console.log('扫描初始化完成')
          })
      },
  
      async onDecode (content) {
        alert(content)
        this.result = content;
        this.turnCameraOff();
      },
  
      timeout (ms) {
        return new Promise(resolve => {
          window.setTimeout(resolve, ms)
        })
      },
      turnCameraOn () {
        this.camera = 'auto'
      },

      turnCameraOff () {
        this.camera = 'off'
      },
    }
  }
  </script>
  
  <style scoped>
    .qrcodebox{
      width: 10rem;
      height: 10rem;
    }
    .qr-scanner {
        background-image: linear-gradient(
              0deg,
              transparent 24%,
              rgba(32, 255, 77, 0.1) 25%,
              rgba(32, 255, 77, 0.1) 26%,
              transparent 27%,
              transparent 74%,
              rgba(32, 255, 77, 0.1) 75%,
              rgba(32, 255, 77, 0.1) 76%,
              transparent 77%,
              transparent
          ),
          linear-gradient(
              90deg,
              transparent 24%,
              rgba(32, 255, 77, 0.1) 25%,
              rgba(32, 255, 77, 0.1) 26%,
              transparent 27%,
              transparent 74%,
              rgba(32, 255, 77, 0.1) 75%,
              rgba(32, 255, 77, 0.1) 76%,
              transparent 77%,
              transparent
          );
      background-size: 3rem 3rem;
      background-position: -1rem -1rem;
      width: 100%;
      height: 100%;
      position: relative;
      background-color: #1110;
    }
    .qr-scanner .box {
      width: 10rem;
      height: 10rem;
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      overflow: hidden;
      border: 0.03rem solid rgba(0, 255, 51, 0.2);
      /* background: url('http://resource.beige.world/imgs/gongconghao.png') no-repeat center center; */
    }
    .qr-scanner .txt {
      width: 100%;
      height: 1rem;
      line-height: 1rem;
      font-size: 0.6rem;
      text-align: center;
      /* color: #f9f9f9; */
      margin: 0 auto;
      position: absolute;
      top: 110%;
      left: 0;
    }
    .qr-scanner .line {
      height: calc(100% - 2px);
      width: 100%;
      background: linear-gradient(180deg, rgba(0, 255, 51, 0) 43%, #00ff33 211%);
      border-bottom: 3px solid #00ff33;
      transform: translateY(-100%);
      animation: radar-beam 2s infinite alternate;
      animation-timing-function: cubic-bezier(0.53, 0, 0.43, 0.99);
      animation-delay: 1.4s;
    }
     
    .qr-scanner .box:after,
    .qr-scanner .box:before,
    .qr-scanner .angle:after,
    .qr-scanner .angle:before {
      content: '';
      display: block;
      position: absolute;
      width: 3vw;
      height: 3vw;
     
      border: 0.2rem solid transparent;
    }
     
    .qr-scanner .box:after,
    .qr-scanner .box:before {
      top: 0;
      border-top-color: #00ff33;
    }
     
    .qr-scanner .angle:after,
    .qr-scanner .angle:before {
      bottom: 0;
      border-bottom-color: #00ff33;
    }
     
    .qr-scanner .box:before,
    .qr-scanner .angle:before {
      left: 0;
      border-left-color: #00ff33;
    }
     
    .qr-scanner .box:after,
    .qr-scanner .angle:after {
      right: 0;
      border-right-color: #00ff33;
    }
     
    @keyframes radar-beam {
      0% {
          transform: translateY(-100%);
      }
     
      100% {
          transform: translateY(0);
      }
    }
  </style>

注:我这里用原生vue写的代码,后用HBilder 5+App 打包

软件打开时使用5+Api调用相机权限,在main.js加这段代码:

// 这里可以调用5+ API了,为了更好的兼容性,应该使用以下代码进行判断
if(window.plus){
  // 在这里调用5+ API
}else{// 兼容老版本的plusready事件
  document.addEventListener('plusready', function(){
    // console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。")
    plus.camera.getCamera();
  });
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Vue.js是一种JavaScript框架,可以用于构建单页应用程序。要在Vue调用摄像头进行二维码扫描,可以使用WebRTC(Web实通信)技术。下面是一个简单的示例: 首先,确保你已经安装了Vue.js和所需的WebRTC库。然后,你可以创建一个Vue组件来处理二维码扫描。在该组件的模板中,你可以添加一个按钮,用于触发摄像头扫描。 ```html <template> <div> <button @click="startScan">扫描二维码</button> <video ref="video" style="display: none;"></video> </div> </template> <script> export default { methods: { startScan() { const video = this.$refs.video; navigator.mediaDevices.getUserMedia({ video: true }) .then(stream => { video.srcObject = stream; video.play(); }) .catch(error => { console.error('无法访问摄像头:', error); }); } } }; </script> ``` 在上面的示例中,我们在`startScan`方法中使用`navigator.mediaDevices.getUserMedia`方法来获取用户媒体流,也就是摄像头的视频输入。然后,我们将媒体流赋值给一个`video`元素的`srcObject`属性,并调用`play`方法播放视频流。你可以根据需要定义其他功能,如解码二维码数据。 请注意,检查和处理WebRTC相关功能的浏览器兼容性也很重要,因为不是所有的浏览器都支持这些功能。如果用户的浏览器不支持或不允许访问摄像头,可以在`catch`块中处理错误,向用户显示适当的信息。 这只是一个简单的示例,你可以根据自己的需求进行调整和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李飞要当大神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值