uniapp 微信小程序:扫码

文章介绍了如何在uniapp中使用uni.scanCode方法和camera组件进行一次一码及连续扫码的操作。通过创建Demo项目,展示了扫码按钮点击回调、扫码结果解析及camera组件扫码模式的设置,包括扫码区域的标记和处理同一码的间隔策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试用二维码

在这里插入图片描述

1. uni.scanCode 一次一码

创建Demo项目

  1. HBuilderX 创建一个新项目,直接用默认模板
  2. 添加一个【扫码】按钮,绑上点击事件。
  3. 使用uni.scanCode 调起客户端扫码界面,扫码成功后返回对应的结果。
界面演示
在这里插入图片描述

camera 之 scanCode模式扫码

<template>
	<view class="content">
		<image class="logo" src="/static/logo.png"></image>
		<view class="text-area">
			<text class="title">{{title}}</text>			
		</view>
		<view>
			<button @click="scanCodeHandler">开始扫码</button>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				title: '调用 uni.scanCode 实现扫码'
			}
		},
		onLoad() {},
		methods: {
			// 扫码按钮点击回调
			scanCodeHandler(){
				let that = this;
				// 调起条码扫描
				uni.scanCode({
					onlyFromCamera: true, // 是否只能从相机扫码,不允许从相册选择图片
					scanType: ['qrCode'], // 扫码类型 qrCode二维码
					autoZoom: false, 	  // 是否启用自动放大,默认启用
					success: function (res) {
						console.log(`扫码结果:${JSON.stringify(res,null,2)}`);
						that.parseQRCode(res);
					},
					fail: function (err) {
						console.log(`错误:${err}`);
					},
					complete: function (data) {
						console.log('擦屁股!');
					}
				});
			},
			// 解析二维码,处理业务
			parseQRCode(data){
				uni.vibrateShort();					// 震动提示
				uni.showToast({title: data.result})	// 弹出提示
			}
		}
	}
</script>

<style>
	/* 样式部分没动 */
</style>

扫码结果演示

扫码结果:

{
  "charSet": "utf-8",
  "scanType": "QR_CODE",
  "errMsg": "scanCode:ok",
  "result": "大家好,我是笨笨,笨笨的笨,笨笨的笨,谢谢!",
  "codeVersion": 8,
  "rawData": "5aSn5a625aW977yM5oiR5piv56yo56yo77yM56yo56yo55qE56yo77yM56yo56yo55qE56yo77yM6LCi6LCi77yB"
}

2. camera 之 mode=“scanCode” 连续扫码

创建 Demo

  1. HBuilderX 创建一个新项目,直接用默认模板
  2. 添加一个 camera 组件,如下调整。
    2.1. mode="scanCode" 将摄像机模式设为扫码
    2.2. @scancode="scancodeEventHandle" 扫码成功回调scancodeEventHandle 方法。
    2.3. 其它参数不赘述看文档即可。
  3. 再添加一个 view 通过样式实现一个绿色标记点。
    3.1. 通过 :style 实现动态 修改标记点位置 。
    3.2. 扫码响应中target.scanArea 值含义:[ left,top,width,height ]单位px
    注意官方有说单位是 rpx,我调了两天,一直对不上。
界面演示
在这里插入图片描述

uni.scanCode 扫码

<template>
	<view>
		<camera device-position="back" flash="off" mode="scanCode" @scancode="scancodeEventHandle" @error="error" >
			<view class="mark" v-show="isShowMark" :style="{ left: obj.l + 'px', top: obj.t +'px' }" ></view>
		</camera>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				lockSet: {},
				obj: { l: 0, t: 0 },
				isShowMark: false
			}
		},
		onLoad(option){
			this.obj = {"l": 0,"t": 0}
		},
		methods: {
			scancodeEventHandle(res){
				let rawData = res.target.rawData;
				if(Object.hasOwn(this.lockSet, rawData) === false){
					this.lockSet[rawData] = true;
					console.log(`扫码响应结果:${JSON.stringify(res)}`);

					this.isShowMark = false; // 开始前先隐藏上一次显示的标记点
					let result = res.target.result
					
					// 震动提示
					uni.vibrateShort({	
						success: () => uni.showToast({title: result}) // 弹出提示
					});
					// 标记位置
					this.markQrCode(res.target);
										
					// 同一个码间隔几秒才会再次处理
					setTimeout(that => delete that.lockSet[rawData], 3000, this);
				}
			},
			markQrCode(target){
				// [左上角x坐标,左上角y坐标,width,height] 单位px
				let [left, top, width, height] = target.scanArea;
				let markWH = uni.upx2px(64) / 2; // mark是边长64rpx的方形,要转成 px
				// 算出显示标记的位置
				this.obj = { "l": left + width/2 - markWH, "t": top + height/2 - markWH };
				// 显示标记点
				this.isShowMark = true;
				// 无任何外力情况下,5秒后也会消失
				setTimeout(that => that.isShowMark = false, 5000, this);
			},
			error(err){
				console.log(`报错:${JSON.stringify(err)}`);
				debugger;
			}
		}
	}
</script>

<style>
	camera {
		margin: 50rpx auto;
		width: 500rpx;
		height: 500rpx;
	}
	.mark{
		position: absolute;
		width: 64rpx;
		height: 64rpx;
		background-color: #00ff00;
		border: 5px solid #f8ffeb;
		border-radius: 50%;
	}
</style>

扫码响应结果

{
  "type": "scancode",
  "target": {
	"dataset": {
	  "eventOpts": [["scancode",[["scancodeEventHandle",["$event"]]]],["error",[["error",["$event"]]]]]
	},
	"id": "",
	"offsetTop": 26,
	"offsetLeft": 66,
	"type": "qrcode",
	"result": "大家好,我是笨笨,笨笨的笨,笨笨的笨,谢谢!",
	"rawData": "5aSn5a625aW977yM5oiR5piv56yo56yo77yM56yo56yo55qE56yo77yM56yo56yo55qE56yo77yM6LCi6LCi77yB",
	"charSet": "utf-8",
	"scanArea": [68.094444,105.23687,84.844955,81.93183]
  },
  "currentTarget": {
	"dataset": {
	  "eventOpts": [["scancode",[["scancodeEventHandle",["$event"]]]],["error",[["error",["$event"]]]]]
	},
	"id": "",
	"offsetTop": 26,
	"offsetLeft": 66
  },
  "timeStamp": 97727,
  "detail": {
	"type": "qrcode",
	"result": "大家好,我是笨笨,笨笨的笨,笨笨的笨,谢谢!",
	"rawData": "5aSn5a625aW977yM5oiR5piv56yo56yo77yM56yo56yo55qE56yo77yM56yo56yo55qE56yo77yM6LCi6LCi77yB",
	"charSet": "utf-8",
	"scanArea": [68.094444,105.23687,84.844955,81.93183]
  },
  "mp": '都是上面内容的重复,略...'
}

参考资料

### UniApp 小程序组件使用方法 在UniApp小程序中实现功能,可以借助特定的插件来简化开发过程。对于HBuilder创建的项目而言,在uniapp项目中集成`mumu-getQrcode`插件是一个可行的选择[^2]。 #### 插件安装 为了引入此插件,开发者需访问DCloud扩展市场并下载名为`mumu-getQrcode`的插件,其ID为7007。通过将该插件加入到项目依赖列表里,能够快速获取二维码解析能力以及摄像头权限处理等功能支持。 #### 页面导航配置 当希望触发描动作时,可以通过定义一个按钮或其他交互控件,并为其绑定相应的事件处理器函数。在此函数内部调用`uni.navigateTo()` API完成页面切换操作: ```javascript // 假设当前位于某个业务逻辑文件内 methods: { scanCode() { uni.navigateTo({ url: '/pages/scan/scan' }) } } ``` 上述代片段展示了如何编写用于启动描界面的方法[^1]。这里假设存在一个路径为`/pages/scan/scan`的目标页面专门负责执行具体的描流程。 #### 描页面构建 针对实际承担描工作的页面(`scan.vue`)来说,则需要进一步利用所选插件提供的API接口来进行具体的功能编工作。下面给出一段简单的模板示意代作为参考: ```html <template> <view class="container"> <!-- 显示提示文字 --> <text>正在初始化相机...</text> <!-- 放置用于展示预览图像区域 --> <camera device-position="back" flash="off"></camera> <!-- 添加其他必要的UI元素 --> </view> </template> <script> export default { onLoad(){ // 初始化设置或加载数据 }, methods:{ startScan(){ plus.barcode.scan( function(result){ console.log('识别结果:', result); }, function(error){ console.error('发生错误:', error.message); } ); } } }; </script> ``` 这段示例不仅包含了基本HTML结构还加入了部分JavaScript逻辑用来控制整个描过程中的行为响应。其中特别提到了`plus.barcode.scan()`这一核心API调用方式及其回调机制的设计思路。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笑虾

多情黯叹痴情癫。情癫苦笑多情难

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

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

打赏作者

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

抵扣说明:

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

余额充值