HarmonyOS 鸿蒙Next 自定义扫码组件
HarmonyOS 鸿蒙Next 自定义扫码组件
鸿蒙扫一扫组件(多码识别)
- 利用鸿蒙系统customScan能力,实现二维码识别
- 支持多码识别
- 支持选择图库扫码能力
- 支持开启关闭闪光灯
- 支持UI定制
- 手指撑开缩小控制镜头缩放倍数
使用示例
单码识别
- 导入
import { Scanner, ScannerController } from '[@coner](/user/coner)/Scanner';
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
- 使用
scannerController: ScannerController = new ScannerController()
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
Scanner({
controller: this.scannerController,
onScanResult: (code: ResultState, value: string) => {
if (code == ResultState.Success) {
promptAction.showToast({ message: value })
}
},
onCameraReject: () => {
promptAction.showToast({ message: '摄像头权限被拒绝' })
}
}).layoutWeight(1)
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
多码识别
- 导入
import { ProScanner, ProScannerController } from '[@ohos](/user/ohos)/Scanner'
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
- 使用
controller: ProScannerController = new ProScannerController()
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
ProScanner({
controller: this.controller,
onFindMultipleCode: (result: scanBarcode.ScanResult[]) => {
promptAction.showToast({ message: '发现了' + result.length + '个二维码' })
},
onScanResult: (code: ResultState, value: string) => {
if (code == ResultState.Success) {
promptAction.showToast({ message: value })
}
}
})
.layoutWeight(1)
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
安装使用
ohpm i [@coner](/user/coner)/scanner
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
Scanner 属性
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
albumsShow | boolean | true | 相册是否显示 |
albumsIcon | ResourceStr | $r('app.media.scanner_albums') | 相册图标 |
albumsIconSize | Length | 64 | 相册图标大小 |
albumsText | string | '相册' | 相册文案 |
albumsTextSize | Length | 16 | 相册文案文字大小 |
albumsTextColor | ResourceColor | Color.White | 相册文案颜色 |
lightShow | boolean | true | 手电筒是否显示 |
lightCloseIcon | ResourceStr | $r('app.media.scanner_light_close') | 手电筒关闭图标 |
lightOpenIcon | ResourceStr | $r('app.media.scanner_light_open') | 手电筒开启图标 |
lightIconSize | Length | 64 | 手电筒图标大小 |
lightOpenText | string | '开灯' | 手电筒开启文案 |
lightCloseText | string | '关灯' | 手电筒关闭文案 |
lightTextSize | Length | 16 | 手电筒文字大小 |
lightTextColor | ResourceColor | Color.White | 手电筒文案颜色 |
tipsShow | boolean | true | 提示词是否显示 |
tips | string | '将条码、二维码放入框内,即可自动扫描' | 提示词内容 |
tipsTextColor | ResourceColor | Color.White | 提示词文字颜色 |
tipsTextSize | Length | 14 | 提示词文字大小 |
tipsTopMargin | Length | 10 | 提示词距离上面的间距 |
maskColor | ResourceColor | '#7f000000' | 遮罩颜色 |
scannerSize | number | 256 | 扫描框宽高 |
cornerLineWidth | number | 3 | 角上的框宽度 |
cornerLineLength | number | 30 | 角上的框长度 |
cornerLineColor | ResourceColor | Color.White | 角上的框颜色 |
cornerLineShow | boolean | true | 四个角是否显示 |
scanTopMargin | number | 100 | 扫描框距离上面的间距 |
scanLineWidth | Length | 1 | 扫描线宽度 |
scanLineLength | Length | '100%' | 扫描线长度 |
scanLineColor | ResourceColor | Color.White | 扫描线颜色 |
scanLineShow | boolean | true | 扫描线是否显示 |
scanAnimTime | number | 1500 | 动画时间 |
scanIntervalTime | number | 1000 | 扫码间隔时间 |
disableCheckArea | boolean | false | 是否禁止检查二维码在框中 |
areaOffset | number | 100 | 二维码在框中的偏移量 |
controller | ScannerController | this.scannerController | 扫码控制类 |
onScanResult | (code: ResultState, value: string) => void | undefined | 扫码结果回调函数 |
onCameraGrant | () => void | undefined | 摄像头权限同意回调 |
onCameraReject | () => void | undefined | 摄像头权限拒绝回调 |
ScannerController控制器
方法 | 入参 | 返回值 | 说明 |
---|---|---|---|
openLight | void | void | 打开闪光灯 |
closeLight | void | void | 关闭闪光灯 |
toggleLight | void | void | 闪光点开关 |
pickPhoto | void | void | 选择图片识别二维码 |
setZoom | zoom: number | void | 设置扫码镜头放大比例 |
getZoom | void | number | 获取扫码镜头放大比例 |
getLightStatus | void | boolean | 获取闪光灯开启状态 |
releaseScan | void | void | 释放相机资源 |
startScan | void | void | 启动扫码 |
rescan | void | void | 重启相机扫码 |
scanUri | uri: string | void | 扫描图片资源uri |
scanUrl | url: string | void | 扫描网络图片url |
scanPixelMap | pixelMap: PixelMap | void | 扫描图片PixelMap |
使用方法
this.scannerController.scanUrl(url) // 扫码结果回调到Scanner组件的onScanResult回调方法
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
ProScanner 属性-多码识别
字段名 | 类型 | 默认值 | 说明 |
---|---|---|---|
albumsShow | boolean | true | 相册是否显示 |
albumsIcon | ResourceStr | $r('app.media.scanner_albums') | 相册图标 |
albumsIconSize | Length | 64 | 相册图标大小 |
albumsText | string | '相册' | 相册文案 |
albumsTextSize | Length | 16 | 相册文案文字大小 |
albumsTextColor | ResourceColor | Color.White | 相册文案颜色 |
lightShow | boolean | true | 手电筒是否显示 |
lightCloseIcon | ResourceStr | $r('app.media.scanner_light_close') | 手电筒关闭图标 |
lightOpenIcon | ResourceStr | $r('app.media.scanner_light_open') | 手电筒开启图标 |
lightIconSize | Length | 64 | 手电筒图标大小 |
lightOpenText | string | '开灯' | 手电筒开启文案 |
lightCloseText | string | '关灯' | 手电筒关闭文案 |
lightTextSize | Length | 16 | 手电筒文字大小 |
lightTextColor | ResourceColor | Color.White | 手电筒文案颜色 |
scanIntervalTime | number | 1000 | 扫码间隔时间 |
pointViewSize | number | 40 | 多码标志点大小 |
pointViewColor | ResourceColor | '#4AA4F9' | 多码标志点颜色 |
pointViewBorderWidth | number | 3 | 多码标志点边框宽度 |
pointIcon | ResourceStr | $r('app.media.scanner_arrow_right') | 多码标志点图片 |
pointIconSize | number | 26 | 多码标志点图片大小 |
pointViewBorderColor | ResourceColor | Color.White | 多码标志点边框颜色 |
pointViewLeftOffset | number | 20 | 多码标志点向左的偏移量 |
pointViewTopOffset | number | 20 | 多码标志点向上的偏移量 |
pointView | CustomBuilder | 组件默认样式 | 多码标志点自定义UI |
controller | ProScannerController | this.scannerController | 扫码控制类 |
onFindMultipleCode | (result: scanBarcode.ScanResult[]) => void | undefined | 发现多码回调函数 |
onScanResult | (code: ResultState, value: string) => void | undefined | 扫码结果回调函数 |
onCameraGrant | () => void | undefined | 摄像头权限同意回调 |
onCameraReject | () => void | undefined | 摄像头权限拒绝回调 |
ProScannerController控制器
与ScannerController一致,此处省略
ScanUtil
- 在非扫码页面(未使用Scanner组件)时调用扫描网络图片、图片uri、图片PixelMap能力
方法 | 入参 | 返回值 | 说明 |
---|---|---|---|
scanUri | uri: string | Promise | 扫描图片资源uri |
scanUrl | url: string | Promise | 扫描网络图片url |
scanPixelMap | pixelMap: PixelMap | Promise | 扫描图片PixelMap |
使用方法
ScanUtil.scanUrl(url)
.then((res) => {
promptAction.showToast({ message: res })
})
.catch((err: string) => {
promptAction.showToast({ message: '失败了:' + err })
})
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
声明权限
entry module下的module.json5中新增如下配置
{
"module": {
// ...
'requestPermissions': [
{
"name": "ohos.permission.INTERNET",
},{
"name": "ohos.permission.CAMERA",
"reason": "$string:reasonRequestCamera",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
}
]
}
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
单码识别自定义UI
Scanner({
cornerLineShow: false, // 隐藏四个角
scanLineShow: false, // 隐藏扫描线
albumsShow: false, // 隐藏图库按钮和文字
lightShow: false, // 隐藏闪光点按钮和文字
tipsShow: false, // 隐藏提示词
maskColor: Color.Transparent, // 蒙层透明
onScanResult: (code: ResultState, value: string) => {
if (code == ResultState.Success) {
promptAction.showToast({ message: value })
}
},
onCameraReject: () => {
promptAction.showToast({ message: '摄像头权限被拒绝' })
}
})
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
多码识别自定义UI
调整默认的多码标志点UI
ProScanner({
pointViewSize: 40,
pointViewColor: '#4AA4F9',
pointViewBorderWidth: 3,
pointIcon: $r('app.media.xxxxx'),
pointIconSize: 26,
pointViewBorderColor: Color.White,
pointViewLeftOffset: 20,
pointViewTopOffset: 20,
})
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
对默认样式不满意可以直接重写标志点UI
ProScanner({
pointView: this.PointView()
})
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
[@Builder](/user/Builder)
PointView() {
// 自定义UI样式
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
2 回复
感谢分享
在HarmonyOS中自定义扫码组件,你需要利用鸿蒙提供的Camera2 API来捕获图像数据,并结合相应的二维码/条形码解析库(如ZXing、ZBar等)来实现扫码功能。首先,确保你的项目已配置好Camera权限,并创建CameraCaptureSession来管理相机。接着,通过CameraCaptureCallback获取图像帧,将帧数据传递给二维码解析库进行解析。最后,处理解析结果。
如果问题依旧没法解决请加我微信,我的微信是itying888。