HarmonyOS 鸿蒙Next中在模拟器中调用相机接口以及相关的OCR功能

HarmonyOS 鸿蒙Next中在模拟器中调用相机接口以及相关的OCR功能 各位前辈大家好,本人小白一名第一次尝试鸿蒙app的开发,在模拟器中运行软件时出现了相机无法调用的问题,但是在设置-扫码的位置是可以调用到电脑的摄像头的,请问是在软件层做了限制吗?

还有我尝试写了一个相册的接口,能够通过相册读取来模拟拍摄得到图片的效果,但是我想通过ocr来获取到图片的信息时也会报错,经过查询,是因为模拟器没有hms cero,使用ocr需要依赖hms cero,请问各位大佬还有别的方式能够实现这个ocr功能吗?

9 回复

你好:

经过测试确认,模拟器中App调用相机是可以实现。

cke_2719.png

详情参考文章:

【HarmonyOS NEXT】鸿蒙应用唤起系统相机拍照 | 华为开发者联盟

【HarmonyOS NEXT】自定义相机拍照和录像 (一)之拍照 | 华为开发者联盟

通过ocr来获取到图片的信息的代码可以发一下。

更多关于HarmonyOS 鸿蒙Next中在模拟器中调用相机接口以及相关的OCR功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


模拟器确实对相机API和HMS Core OCR有部分限制,扫码能调用是因为系统级支持,而应用层相机接口依赖模拟器的完整硬件模拟,部分版本不支持。

OCR方面,模拟器无HMS Core服务,所以无法使用HMS OCR。可改用:

  1. 纯前端轻量OCR库(如Tesseract.js),直接处理图片数据;
  2. 调用服务端OCR接口(如华为云OCR),上传图片获取结果;
  3. 直接用真机调试,能同时解决相机和HMS OCR的问题。

hms 是以前Android系统下的,纯血鸿蒙要用新的OCR实现,参考:官方的OCR功能:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/vision-imageanalyzer

cke_5234.jpeg

import { visionImageAnalyzer } from '@kit.VisionKit';
import { BusinessError } from '@kit.BasicServicesKit'
@Entry
@Component
struct ImageDemo {
  private visionImageAnalyzerController: visionImageAnalyzer.VisionImageAnalyzerController = new visionImageAnalyzer.VisionImageAnalyzerController()
  private isSupportImageAnalyzer: boolean = false;
  aboutToAppear(): void {
    let supportTypes = this.visionImageAnalyzerController.getImageAnalyzerSupportTypes();
    if (supportTypes.length > 0) {
      this.isSupportImageAnalyzer = true;
      this.registerListener();
    }
  }

  registerListener(){
    this.visionImageAnalyzerController.on('imageAnalyzerVisibilityChange', (visibility: visionImageAnalyzer.ImageAnalyzerVisibility) => {
      console.info("DEMO_TAG", `imageAnalyzerVisibilityChange result: ${JSON.stringify(visibility)}`)
    })
    this.visionImageAnalyzerController.on('textAnalysis', (text: string) => {
      console.info("DEMO_TAG", `textAnalysis result: ${JSON.stringify(text)}`)
    })
    this.visionImageAnalyzerController.on('selectedTextChange', (selectedText: string) => {
      console.info("DEMO_TAG", `selectedTextChange result: ${JSON.stringify(selectedText)}`)
    })
    this.visionImageAnalyzerController.on('subjectAnalysis', (subjects: visionImageAnalyzer.Subject[]) => {
      console.info("DEMO_TAG", `subjectAnalysis result: ${JSON.stringify(subjects)}`)
    })
    this.visionImageAnalyzerController.on('selectedSubjectsChange', (subjects: visionImageAnalyzer.Subject[]) => {
      console.info("DEMO_TAG", `selectedSubjectsChange result: ${JSON.stringify(subjects)}`)
    })
    this.visionImageAnalyzerController.on('analyzerFailed', (error: BusinessError) => {
      console.error("DEMO_TAG", `analyzerFailed result: ${JSON.stringify(error)}`)
    })
  }
  build() {
    Stack() {
      Image($r('app.media.scenery01'), {
        types: [ImageAnalyzerType.TEXT, ImageAnalyzerType.SUBJECT, ImageAnalyzerType.OBJECT_LOOKUP],
        aiController: this.visionImageAnalyzerController
      })
        .width('100%')
        .height('100%')
        .enableAnalyzer(this.isSupportImageAnalyzer ? true : false)
        .objectFit(ImageFit.Contain)
    }.width('100%').height('100%')
  }
  aboutToDisappear(): void {
    this.visionImageAnalyzerController.off('imageAnalyzerVisibilityChange')
    this.visionImageAnalyzerController.off('textAnalysis')
    this.visionImageAnalyzerController.off('selectedTextChange')
    this.visionImageAnalyzerController.off('subjectAnalysis')
    this.visionImageAnalyzerController.off('selectedSubjectsChange')
    this.visionImageAnalyzerController.off('analyzerFailed')
  }
}

Android下老的OCR在这里,对比一下:

https://developer.huawei.com/consumer/cn/doc/hiai-Guides/screenshot-ocr-introduction-0000001054078319

图片

模拟器调用相机是有点限制的,参考这个《扩展能力-摄像头》看看你的配置。

关于OCR,如果要做产品,官方的《Core Vision Kit》的OCR就可以,但要真机测试。

如果是学习用和小频率调用测试,远程调API可以满足,腾讯、阿里、科大讯飞、百度都有免费调用的。

看下你是想要这些能力吧,如下图

cke_302.png

上述的能力是可以通过api 接口实现的, 我基本上会调用外部接口来实现一些复杂的ocr 能力

链接地址 https://www.textin.com/ , 如有帮助给个采纳谢谢

在鸿蒙模拟器里,你遇到的两个问题(相机、OCR)基本都不是你代码写错,而是模拟器能力限制导致的,这在新手阶段很常见。


1)模拟器里“系统扫码能调到电脑摄像头”,但你 App 调相机不行?

多数情况下是模拟器只对少数系统组件/系统应用开放了宿主机摄像头通道(例如系统“扫码”),但并不保证第三方应用通过 CameraKit/相机 API 能拿到同一通道

你可以这样快速判断是哪一类问题:

A. 如果你的代码报的是 “801 Capability not supported” / “not supported”

基本就是:模拟器不支持该相机能力(或该 API 在模拟器侧没实现/被裁剪),只能上真机测。

B. 如果报权限相关(201/Permission denied 等)

那是软件侧问题,你需要:

  • module.json5 声明相机权限(CAMERA)
  • 运行时动态申请权限
  • 并且确保当前 Ability 在前台

但你描述“系统扫码可以、App 不行”,更像是 A(能力限制)而不是权限问题。

建议结论:相机这块,想稳定验证功能,请优先用真机;模拟器只能用来跑 UI/业务逻辑。


2)OCR 在模拟器报错:提示依赖 HMS Core(你说的 hms cero)

是的,很多 OCR/视觉类能力(尤其是“Kit”类的端侧 AI 能力)会依赖 HMS Core / Cero 之类的运行环境。模拟器通常不带,也基本没法像手机一样装全套 HMS Core 环境,所以会报你看到的错误。


3)那有没有“不依赖 HMS Core / 模拟器也能跑”的 OCR 方案?

有,但都属于“绕开端侧 Kit”的路线:

方案 1(最推荐,新手也最容易跑通):走云端 OCR(HTTP API)

流程:

  1. 模拟器用相册选图(你已经做到了)
  2. 把图片上传到你自己的服务端(或云函数)
  3. 服务端调用 OCR(你选用任意供应商的 OCR:华为云/百度/阿里/腾讯/Google 等)
  4. 把识别结果返回给 App

优点:模拟器可用、兼容最好、实现简单
缺点:需要网络与服务端;有费用/隐私合规要注意

方案 2:本地离线 OCR(Tesseract 等)——能做但不建议新手一开始就上

你可以把 OCR 引擎(如 tesseract + leptonica)编成 native 库,用 NAPI/ArkTS 调用。 优点:离线、无需 HMS
缺点:集成复杂、包体大、性能调优麻烦、适配成本高

方案 3:把 OCR 放到 PC 侧(开发期临时方案)

开发阶段先用“本地脚本/本地服务(Python OCR)”跑通联调,等真机环境 OK 后再决定端侧还是云侧。


4)你现在该怎么选(给你一个最省事的建议)

  • 相机:不要纠结模拟器,直接真机调试(这是最省时间的)。
  • OCR:如果你只是想把功能跑通,建议先用云端 OCR;等业务验证没问题,再考虑是否一定要端侧离线。

大概率是你没有申请相机权限吧。

在HarmonyOS Next模拟器中,调用相机接口需先声明ohos.permission.CAMERA权限,并使用@ohos.multimedia.camera API创建CameraManager获取预览流。OCR功能可集成@ohos.ai.ocr系统能力,直接对图像帧进行文本识别。注意模拟器可能缺失物理相机,需通过模拟输入或替换为本地图片进行验证。

模拟器中,系统级应用(如设置中的扫码)可直接调用摄像头,但第三方应用通过CameraKit等API访问相机受模拟器能力限制,目前不支持,并非代码问题。

OCR功能依赖HMS Core ML Kit,而HarmonyOS Next模拟器未内置HMS Core环境,因此直接调用会失败。若需在模拟器上实现文字识别,可改用本地文本识别库第三方云端OCR服务。例如使用Tesseract.js(opencv结合)或调百度OCR API,示例:

// 调用百度OCR通用文字识别(需提前申请ak/sk)
function baiduOCR(imageBase64: string) {
  const url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic';
  const params = { image: imageBase64 };
  http.request(url, { method: 'POST', body: JSON.stringify(params), ... });
}

但需注意网络权限配置。真机调试时,推荐直接使用HMS Core ML Kit原生方案,准确率和性能最优。

回到顶部