引言:
鸿蒙系统凭借其“统一扫码服务(Scan Kit)”和“原生智感交互”,彻底重构了扫码体验。从支付、社交到跨设备协作,用户只需轻敲手机后盖或自动感知即可完成操作,而开发者也能通过开放能力快速构建复杂场景的扫码功能。本文将深度解析鸿蒙扫码的技术革新与使用技巧。
一、鸿蒙扫码的三大核心优势
-
统一扫码服务(Scan Kit):软硬协同的“万能钥匙”
- 多场景识别优化:通过AI算法和计算机视觉技术,鸿蒙攻克了暗光、污损、曲面码等传统扫码痛点,成功率提升30%。
- 开发便捷性:提供标准化扫码界面(含相机预授权、闪光灯提示),支持“默认界面”与“自定义界面”两种模式,适用于电商、金融等场景。
- 案例:新大陆公司基于Scan Kit优化工业读码器,提升生产线效率。
-
智感交互:解锁“无感”操作
- 轻敲后盖扫码:鸿蒙3.0及以上版本支持双击手机背部快速调出支付码、健康码,省去应用切换步骤。
- 感知支付:手机靠近扫码设备15cm内自动唤醒支付界面,默认支持微信、支付宝等。
- 原生鸿蒙进阶:2025年原生系统进一步整合“扫码直达”功能,用户解锁后直接对准二维码即可完成全流程操作。
-
生态联动:打破设备孤岛
- 跨端协作:例如小红书鸿蒙版支持“碰一碰”分享笔记,扫码直达页面,减少跳转路径。
- 行业赋能:金融场景中,鸿蒙实现收银机、扫码器、打印机等设备的无缝互联,提升服务效率。
二、开发者实战:如何完成鸿蒙扫码?
1、截图
我们需要使用到这个组件componentSnapshot,完成截图功能
import { componentSnapshot } from '@kit.ArkUI'
@State img: PixelMap | null = null
组件().id('xxx')
Button('点我截图')
.onClick(() => {
this.img = componentSnapshot.getSync('xxx')
})
2、保存截图
有了截图之后,我们也需要保存到相册之中SaveButton
核心代码
import { image } from '@kit.ImageKit'
@State img: PixelMap
SaveButton()
.onClick(async () => {
// 1. 创建ImagePacker实例,压缩后获得图片的二进制数据imgBuffer
const imagePackerApi = image.createImagePacker();
let imgBuffer = await imagePackerApi.packing(this.img, { format: 'image/jpeg', quality: 100 })
// 2. 将imgBuffer写入到相册
const context = getContext();
let helper = photoAccessHelper.getPhotoAccessHelper(context);
// onClick触发后10秒内通过createAsset接口创建图片文件,10秒后createAsset权限收回。
let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpeg');
// 使用uri打开文件,可以持续写入内容,写入过程不受时间限制
// Logger.debug(uri)
let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
// 写入图片
fileIo.writeSync(file.fd, imgBuffer!);
// 关闭文件
await fileIo.close(file.fd);
Logger.debug('图片写入成功')
}
3、生成二维码
使用QRCode
组件将所需要的数据生成为二维码
QRCode('13800')
.color(Color.Green)
.height(200)
.height(200)
4、调用扫码能力
// 1. 增加扫码图标
Row({space:5}){
Image($r('app.media.icon_point'))
.width(24)
.aspectRatio(1)
.onClick(() => {
this.scanQuestionCode()
})
.layoutWeight(1)
HdSearch()
.layoutWeight(3)
HdClockIn()
.layoutWeight(1)
}
// 2. 扫码
async scanQuestionCode() {
if (canIUse('SystemCapability.Multimedia.Scan.ScanBarcode')) {
const result = await scanBarcode.startScanForResult(getContext(this))
if (result.originalValue) {
try {
//扫码之后需要做什么
} catch (e) {
promptAction.showToast({ message: '扫码失败' })
}
}
}
}
适用HarmonyOS NEXT / API12或以上版本 -----------------