前提
由于涉及到调用手机摄像头,涉及到隐私,必须在HTTPS环境使用。
<template> <view class="qrcode"> <uni-nav-bar left-icon="left" :background-color="' '" :border="false" title="扫码" :fixed="true" @clickLeft="$back" :shadow='true' :leftText='"取消"'> </uni-nav-bar> <view id="reader"></view> <view class="error" v-if="isError"> <view class="on1">相机权限被拒绝,请尝试如下操作:</view> <view>· 刷新页面后重试;</view> <view>· 在系统中检测当前App或浏览器的相机权限是否被禁用;</view> <view>· 如果依然不能体验,建议在微信中打开链接;</view> </view> </view> </template> <script> import { Html5Qrcode } from "html5-qrcode"; export default { props:{ isError:{ type:Boolean, default:false } }, created() { this.getCameras() }, beforeDestroy() { this.stop(); }, methods: { $back(){ uni.navigateBack() }, getCameras() { Html5Qrcode.getCameras() .then((devices) => { console.log(devices,'sss') if (devices && devices.length) { this.html5QrCode = new Html5Qrcode("reader"); this.start(); } }) .catch((err) => { // handle err this.html5QrCode = new Html5Qrcode("reader"); this.error = "ERROR: 您需要授予相机访问权限" this.$emit("err", this.error) }); }, start() { //environment后置 user前置 this.html5QrCode .start({ facingMode: "environment" }, { fps: 2, qrbox: { width: 200, height: 200 }, }, (decodedText, decodedResult) => { this.$emit("ok", decodedText) } ) .catch((err) => { this.$emit("err", err) }); }, stop() { this.html5QrCode.stop().then((ignore) => { // QR Code scanning is stopped. console.log("QR Code scanning stopped."); }) .catch((err) => { // Stop failed, handle it. console.log("Unable to stop scanning."); }); }, } } </script> <style scoped lang="scss" > .qrcode { position: absolute; top: 0; left: 0; width: 100vw; height: 100vh; // position: relative; background-image: linear-gradient(0deg, transparent 24%, rgba(32, 255, 77, .1) 25%, rgba(32, 255, 77, .1) 26%, transparent 27%, transparent 74%, rgba(32, 255, 77, .1) 75%, rgba(32, 255, 77, .1) 76%, transparent 77%, transparent), linear-gradient(90deg, transparent 24%, rgba(32, 255, 77, .1) 25%, rgba(32, 255, 77, .1) 26%, transparent 27%, transparent 74%, rgba(32, 255, 77, .1) 75%, rgba(32, 255, 77, .1) 76%, transparent 77%, transparent); background-size: 3rem 3rem; background-position: -1rem -1rem; z-index: 10; background-color: rgba(17, 17, 17, 0); z-index: 999; } #reader { position: absolute; top: 50%; left: 0; transform: translateY(-50%); z-index: 1000; } .error { color: #fff; padding: 40rpx; font-size: 24rpx; background-color: #333; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 630rpx; border-radius: 15rpx; } .on1{ font-size: 30rpx; } </style>
复制