Skip to content
Back to skills

Hmos Scan Kit Detect Barcode

ASecurity

识别本地图片中的条形码、二维码、MULTIFUNCTIONAL CODE,返回码类型、码值、码位置信息,支持单码和多码识别,适用于图库图片识码、付款码识别场景

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 22, 2026
developmenttypescriptapiperformance

Works with

  • api

Security analysis

A100/100

Pro scans all 5 files and shows the line behind each finding

Scanned September 22, 2026

npx -y skills add IsKenKenYa/skills --skill hmos-scan-kit-detect-barcode --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Hmos Scan Kit Detect Barcode?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Hmos Scan Kit Detect Barcode
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iskenkenya-hmos-scan-kit-detect-barcode/badge)](https://www.skillsdirectory.com/skills/iskenkenya-hmos-scan-kit-detect-barcode)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: hmos-scan-kit-detect-barcode
description: 识别本地图片中的条形码、二维码、MULTIFUNCTIONAL CODE,返回码类型、码值、码位置信息,支持单码和多码识别,适用于图库图片识码、付款码识别场景
---

# 识别本地图片技能

## 功能描述

本技能提供本地图片识码能力,支持对图库中的条形码、二维码、MULTIFUNCTIONAL CODE进行识别,并获取码类型、码值、码位置(码图最小外接矩形左上角和右下角的坐标)等信息。该能力可用于一图单码和一图多码的识别,比如条形码、付款码等。

**核心能力**:
- 支持13种码类型识别:AZTEC、CODABAR、CODE 39、CODE 93、CODE 128、DATA MATRIX、EAN-8、EAN-13、ITF-14、PDF417、QR CODE、UPC-A、UPC-E、MULTIFUNCTIONAL CODE
- 支持单码和多码识别模式
- 返回码的位置信息(外接矩形坐标)
- 支持通过picker选择图库图片
- 提供Promise和Callback两种异步调用方式

**适用版本**:API version 4.1.0(11)及以上

## 使用场景

### 触发词
- "识别本地图片中的码"
- "图片识码"
- "识别图库二维码"
- "识别条形码图片"
- "本地图片扫码"
- "detectBarcode"

### 能做
- 识别图库中存储的条形码、二维码、MULTIFUNCTIONAL CODE
- 获取码的类型、码值、码位置信息
- 支持单张图片中识别一个或多个码
- 通过picker选择图片后进行识码
- 返回码图的最小外接矩形坐标位置

### 绝不做
- 不支持直接识别相机流数据(需要使用customScan或decodeImage接口)
- 不支持识别视频中的码
- 不支持实时扫码(需要使用默认界面扫码或自定义界面扫码)
- 不处理超出图片识码范围的请求(如生成码图)
- 不支持识别网络图片URL(需要先下载到本地)

### 补充
- 推荐使用picker获取图片路径,确保uri格式正确
- 多码识别模式下,最多可识别同一图片中的多个码
- 图片识码为同步算法处理,不支持并行调用decodeImage接口
- 传入的图片uri必须为有效路径,否则会触发1000500001错误

## 调用规范和规则

### 输入约束
- 图片格式:支持常见图片格式(JPEG、PNG等)
- 图片路径:必须为有效的本地路径,格式为`file://media/Photo/x/xxx.jpg`
- 图片大小:无明确限制,建议不超过10MB
- 图片数量:每次调用识别一张图片
- 码图数量:单码模式识别一个码,多码模式可识别多个码

### 执行约束
- 最大耗时:依赖图片大小和码图复杂度,通常1-5秒
- API调用频次:无明确限制
- 并发限制:decodeImage接口不支持并行调用
- 调用方式:支持Promise和Callback两种异步回调

### 内容约束
- 禁止生成:不生成码图,只识别已有码图
- 禁止操作:不修改原始图片内容
- 参数校验:必须校验InputImage的uri参数是否有效
- 错误处理:必须捕获并处理401和1000500001错误码

### 降级约束
- 图片读取失败:提示用户检查图片路径,重新选择图片
- 识码失败:提示用户图片中可能无码或码图质量较差
- 多码识别失败:降级为单码识别模式
- 权限不足:提示用户授予相册访问权限

## 调用流程和步骤

### 步骤1:准备阶段

**导入必要模块**:
```typescript
import { scanCore, scanBarcode, detectBarcode } from '@kit.ScanKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
```

**前置校验**:
1. 检查应用是否已授予相册访问权限
2. 确认HarmonyOS版本不低于4.1.0(11)
3. 确认已导入@kit.ScanKit模块

### 步骤2:通过Picker选择图片

**使用photoAccessHelper选择图片**:
```typescript
let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
photoSelectOptions.maxSelectNumber = 1;
photoSelectOptions.isPhotoTakingSupported = false;
photoSelectOptions.isEditSupported = false;

let photoPicker = new photoAccessHelper.PhotoViewPicker();
photoPicker.select(photoSelectOptions).then((result: photoAccessHelper.PhotoSelectResult) => {
  if (!result || (result.photoUris && result.photoUris.length === 0)) {
    hilog.error(0x0001, 'picker', 'Failed to get PhotoSelectResult by promise');
    return;
  }
  hilog.info(0x0001, 'picker', `Succeeded in getting PhotoSelectResult by promise.`);
}).catch((error: BusinessError) => {
  hilog.error(0x0001, 'picker', `Failed to get PhotoSelectResult by promise. Code: ${error.code}`);
});
```

### 步骤3:调用detectBarcode.decode接口(Promise方式)

**定义识码参数并调用接口**:
```typescript
let options: scanBarcode.ScanOptions = {
  scanTypes: [scanCore.ScanType.ALL],
  enableMultiMode: true,
  enableAlbum: true
};

let inputImage: detectBarcode.InputImage = { uri: result.photoUris[0] };

try {
  detectBarcode.decode(inputImage, options).then((result: Array<scanBarcode.ScanResult>) => {
    hilog.info(0x0001, '[Scan Sample]',
      `Succeeded in getting ScanResult by promise with options, result is ${JSON.stringify(result)}`);
  }).catch((error: BusinessError) => {
    hilog.error(0x0001, '[Scan Sample]',
      `Failed to get ScanResult by promise with options. Code: ${error.code}, message: ${error.message}`);
  });
} catch (error) {
  hilog.error(0x0001, '[Scan Sample]',
    `Failed to detectBarcode. Code: ${error.code}, message: ${error.message}`);
}
```

### 步骤4:调用detectBarcode.decode接口(Callback方式)

**使用Callback回调处理结果**:
```typescript
let options: scanBarcode.ScanOptions = {
  scanTypes: [scanCore.ScanType.ALL],
  enableMultiMode: true,
  enableAlbum: true
};

let inputImage: detectBarcode.InputImage = { uri: result.photoUris[0] };

try {
  detectBarcode.decode(inputImage, options, (error: BusinessError, result: Array<scanBarcode.ScanResult>) => {
    if (error && error.code) {
      hilog.error(0x0001, '[Scan Sample]',
        `Failed to get ScanResult by callback with options. Code: ${error.code}, message: ${error.message}`);
      return;
    }
    hilog.info(0x0001, '[Scan Sample]',
      `Succeeded in getting ScanResult by callback with options, result is ${JSON.stringify(result)}`);
  });
} catch (error) {
  hilog.error(0x0001, '[Scan Sample]',
    `Failed to detectBarcode. Code: ${error.code}, message: ${error.message}`);
}
```

### 步骤5:处理识码结果

**解析ScanResult数据结构**:
```typescript
for (let scanResult of result) {
  hilog.info(0x0001, '[Scan Sample]', `ScanType: ${scanResult.scanType}`);
  hilog.info(0x0001, '[Scan Sample]', `OriginalValue: ${scanResult.originalValue}`);
  
  if (scanResult.scanCodeRect) {
    hilog.info(0x0001, '[Scan Sample]', 
      `Position: left=${scanResult.scanCodeRect.left}, top=${scanResult.scanCodeRect.top}, 
       right=${scanResult.scanCodeRect.right}, bottom=${scanResult.scanCodeRect.bottom}`);
  }
}
```

### 步骤6:错误处理

**错误码处理逻辑**:
```typescript
try {
  await detectBarcode.decode(inputImage, options);
} catch (error) {
  switch (error.code) {
    case 401:
      hilog.error(0x0001, '[Scan Sample]', 'Parameter error. Check inputImage uri format.');
      break;
    case 1000500001:
      hilog.error(0x0001, '[Scan Sample]', 'Internal error. Try again or check image quality.');
      break;
    default:
      hilog.error(0x0001, '[Scan Sample]', `Unknown error: ${error.message}`);
  }
}
```

### 步骤7:降级处理

**单码识别降级方案**:
```typescript
async function detectBarcodeWithFallback(uri: string): Promise<void> {
  let inputImage: detectBarcode.InputImage = { uri: uri };
  
  try {
    let multiModeOptions: scanBarcode.ScanOptions = {
      scanTypes: [scanCore.ScanType.ALL],
      enableMultiMode: true
    };
    
    let result = await detectBarcode.decode(inputImage, multiModeOptions);
    if (result.length > 0) {
      hilog.info(0x0001, '[Scan Sample]', `Multi-mode succeeded, found ${result.length} codes`);
    }
  } catch (error) {
    hilog.warn(0x0001, '[Scan Sample]', 'Multi-mode failed, fallback to single-mode');
    
    try {
      let singleModeOptions: scanBarcode.ScanOptions = {
        scanTypes: [scanCore.ScanType.ALL],
        enableMultiMode: false
      };
      
      let result = await detectBarcode.decode(inputImage, singleModeOptions);
      hilog.info(0x0001, '[Scan Sample]', `Single-mode succeeded`);
    } catch (fallbackError) {
      hilog.error(0x0001, '[Scan Sample]', 'Both multi and single mode failed');
    }
  }
}
```

## 错误码说明

| 错误码 | 说明 | 可能原因 | 解决方法 |
|-------|------|---------|---------|
| 401 | Parameter error | 1. 参数类型错误<br>2. 参数校验失败 | 检查InputImage的uri参数格式是否正确 |
| 1000500001 | Internal error | 1. 算法异常<br>2. 图片读取失败<br>3. 传入uri无效 | 1. 尝试重新调用接口<br>2. 检查传入的uri路径<br>3. 确认图片文件存在 |

**错误码详细说明**:
- **401错误**:参数校验失败,通常是因为InputImage的uri参数格式不正确或为空。确保uri为有效的本地路径,格式如`file://media/Photo/x/xxx.jpg`。
- **1000500001错误**:内部错误,可能原因包括:
  - 算法异常:图片中码图质量较差或无法识别
  - 图片读取失败:传入的uri路径无效或文件不存在
  - 系统创建图像逻辑异常

## 编译和修复问题

### 依赖声明
```json
{
  "dependencies": {
    "@kit.ScanKit": "4.1.0(11)",
    "@kit.MediaLibraryKit": "4.1.0(11)",
    "@kit.PerformanceAnalysisKit": "4.1.0(11)",
    "@kit.BasicServicesKit": "4.1.0(11)"
  }
}
```

### 环境要求
- HarmonyOS版本:不低于4.1.0(11)
- 开发模型:Stage模型
- 系统能力:SystemCapability.Multimedia.Scan.ScanBarcode

### 常见编译问题

**问题1:模块导入失败**
```
Error: Cannot find module '@kit.ScanKit'
```
**解决方法**:确认DevEco Studio版本支持HarmonyOS 4.1.0(11),检查项目配置是否正确。

**问题2:photoAccessHelper导入错误**
```
Error: Cannot find name 'photoAccessHelper'
```
**解决方法**:确保导入路径正确:`import { photoAccessHelper } from '@kit.MediaLibraryKit';`

**问题3:类型定义错误**
```
Error: Property 'photoUris' does not exist on type 'PhotoSelectResult'
```
**解决方法**:检查API版本,photoUris属性在4.1.0(11)版本可用。

### 权限配置

**module.json5权限声明**:
```json
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.READ_MEDIA",
        "reason": "用于读取图库中的图片进行识码"
      }
    ]
  }
}
```

## 常见问题与解决方法

### Q1:picker选择图片后photoUris为空
**原因**:未正确配置picker参数或用户未选择图片
**解决方法**:
- 检查photoSelectOptions的MIMEType配置
- 确认maxSelectNumber大于0
- 处理用户取消选择的情况

### Q2:decode接口返回空数组
**原因**:图片中无码图或码图质量较差无法识别
**解决方法**:
- 提示用户选择包含清晰码图的图片
- 尝试调整ScanOptions参数,如设置具体的scanTypes
- 检查图片质量和码图清晰度

### Q3:多码识别模式下只识别到一个码
**原因**:图片中确实只有一个码,或多个码质量差异较大
**解决方法**:
- 检查图片中实际码图数量
- 尝试使用单码识别模式提高准确率
- 检查码图位置和大小是否合理

### Q4:传入uri后触发1000500001错误
**原因**:图片路径无效或文件不存在
**解决方法**:
- 确保使用picker返回的uri,不要手动构造路径
- 检查uri格式是否为`file://media/Photo/x/xxx.jpg`
- 确认图片文件在图库中存在

### Q5:识别速度较慢
**原因**:图片较大或码图复杂度高
**解决方法**:
- 选择较小尺寸的图片
- 避免识别超高分辨率图片
- 如只识别特定码类型,设置scanTypes参数缩小识别范围

### Q6:不支持网络图片URL识别
**原因**:detectBarcode.decode接口只支持本地图片uri
**解决方法**:
- 先下载网络图片到本地
- 使用本地路径作为InputImage的uri参数
- 或使用其他接口处理网络图片

## 输出结果报告

执行完成后输出以下信息:

```json
{
  "status": "success",
  "scanResultCount": 1,
  "scanResults": [
    {
      "scanType": 11,
      "scanTypeName": "QR_CODE",
      "originalValue": "https://example.com",
      "scanCodeRect": {
        "left": 100,
        "top": 200,
        "right": 300,
        "bottom": 400
      }
    }
  ],
  "apiUsed": [
    "detectBarcode.decode",
    "photoAccessHelper.PhotoViewPicker.select"
  ],
  "inputImage": {
    "uri": "file://media/Photo/1/xxx.jpg"
  },
  "scanOptions": {
    "scanTypes": ["ALL"],
    "enableMultiMode": true,
    "enableAlbum": true
  }
}
```

**结果说明**:
- **status**:识码状态,success或failed
- **scanResultCount**:识别到的码图数量
- **scanResults**:识别结果数组,包含码类型、码值、位置信息
- **apiUsed**:调用的API列表
- **inputImage**:输入的图片信息
- **scanOptions**:使用的识码参数

## 参考文档

- [API开发指南 - 识别本地图片](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/scan-detectbarcode)
- [API参考说明 - detectBarcode图像识码](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/scan-imagedecode)
- [API参考说明 - scanBarcode默认界面扫码](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/scan-scanbarcode-api)
- [API参考说明 - scanCore扫码公共信息](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/scan-scancore)
- [API参考说明 - ArkTS API错误码](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/scan-error-code)

## 完整示例代码

- [ArkTS示例 - Promise方式识码](assets/detect_barcode_promise.ets)
- [ArkTS示例 - Callback方式识码](assets/detect_barcode_callback.ets)
- [ArkTS示例 - 完整页面实现](assets/detect_barcode_page.ets)

## 测试用例

### 正向测试用例
- [识别单个二维码](tests/test_single_qr_code.py):测试识别图片中的单个QR Code
- [识别多个二维码](tests/test_multi_qr_codes.py):测试多码识别模式
- [识别条形码](tests/test_barcode.py):测试识别CODE 128条形码

### 边界测试用例
- [识别模糊码图](tests/test_blur_code.py):测试码图质量较差的情况
- [识别小尺寸码图](tests/test_small_code.py):测试码图占比较小的图片
- [识别大尺寸图片](tests/test_large_image.py):测试高分辨率图片识码

### 异常测试用例
- [无效图片路径](tests/test_invalid_uri.py):测试传入无效uri的错误处理
- [无码图图片](tests/test_no_code.py):测试图片中无码图的返回结果
- [权限不足](tests/test_permission_denied.py):测试无相册访问权限的错误处理

Files in this skill

  • SUB_SKILL.md14.8 KB
  • assets/detect_barcode_callback.ets5.5 KB
  • assets/detect_barcode_page.ets8.9 KB
  • assets/detect_barcode_promise.ets4.9 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…