HarmonyOS 鸿蒙Next中调用AREngine的arViewController接口导致崩溃

HarmonyOS 鸿蒙Next中调用AREngine的arViewController接口导致崩溃 【问题描述】:调用AREngine的arViewController接口导致崩溃,ar的其他内容调用都是正常的,使用的是官网硬件要求硬件要求选择对应接口判断当前设备是否支持AR Engine,只要用到arViewController就会崩溃,知道是不支持模拟器的,但是报的崩溃有点不理解

【问题现象】:import { arEngine, arViewController } from ‘@kit.AREngine’;

let ret: boolean = arViewController.isARTypeSupported(arEngine.ARFeatureType.ARENGINE_FEATURE_TYPE_FACE);

【版本信息】:API23

【复现代码】:NA

【尝试解决方案】:NA


更多关于HarmonyOS 鸿蒙Next中调用AREngine的arViewController接口导致崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

建议使用 try-catch 或错误回调来处理不支持的情况。

示例代码:

import { arEngine, arViewController } from '@kit.AREngine';

try {
  let ret: boolean = arViewController.isARTypeSupported(arEngine.ARFeatureType.ARENGINE_FEATURE_TYPE_FACE);
  console.info('AR Face supported: ' + ret);
} catch (error) {
  console.error('AR Face check failed, error: ' + error.code);
  if (error.code === 801) {
    console.error('Device does not support AR Face');
  }
}

更多关于HarmonyOS 鸿蒙Next中调用AREngine的arViewController接口导致崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


核心原因

arViewController 不能直接在主线程 / 页面初始化阶段同步调用,必须在ARSession 创建完成、权限获取成功、设备能力异步校验之后调用,否则直接崩溃。

正确代码(直接复制可用)

import { arEngine, arViewController, Permission } from '@kit.AREngine';
import { abilityAccessCtrl, Permissions } from '@ohos.abilityAccessCtrl';

@Entry
@Component
struct ARDemo {
  async aboutToAppear() {
    // 1. 先申请相机权限
    let atManager = abilityAccessCtrl.createAtManager();
    await atManager.requestPermissionsFromUser(this.context, [Permissions.PERMISSION_CAMERA]);

    // 2. 异步判断支持性(必须异步,不能直接同步调用)
    try {
      let isSupport = await arViewController.isARTypeSupported(arEngine.ARFeatureType.ARENGINE_FEATURE_TYPE_FACE);
      console.log("是否支持人脸AR:", isSupport);
    } catch (err) {
      console.error("判断失败:", err);
    }
  }

  build() {
    Column() {}
  }
}

关键规则

  1. 必须先获取相机权限,再调用 arViewController
  2. 必须异步调用(加 await /.then ()),不能同步直接调用
  3. 必须在真机运行,模拟器 100% 崩溃
  4. 必须先创建 / 绑定 ARSession 再调用(官方隐性要求)
  5. AR Engine 开发指南 https://developer.huawei.com/consumer/cn/hms/huawei-arengine

arViewController.isARTypeSupported(...) 这类“能力查询”接口并不保证一定只返回 boolean:当设备不兼容/服务不可用时,会以**抛出异常(BusinessError)**的方式给出错误码(例如文档里提到的 801:Device not compatible)。如果你没有 try/catch,ArkTS 里未捕获异常会直接导致应用崩溃——看起来就像“调用这个接口就崩”。

import { arEngine, arViewController } from '@kit.AREngine'
import { BusinessError } from '@kit.BasicServicesKit'

let supported = false
try {
  supported = arViewController.isARTypeSupported(arEngine.ARFeatureType.ARENGINE_FEATURE_TYPE_FACE)
  console.info(`AR face supported = ${supported}`)
} catch (e) {
  const err = e as BusinessError
  console.error(`isARTypeSupported failed, code=${err.code}, message=${err.message}`)
  // 常见:801 设备不兼容 / 1009200009 服务不可用等(按实际 err.code 处理)
  supported = false
}

另外建议你再排查两点(都可能导致“调用即崩/即报错”):

  1. 运行环境:模拟器不支持 AR Engine(即便能编译,通过接口调用也可能直接失败)。
  2. 设备/系统能力:该模块标注的系统能力是 SystemCapability.AREngine.Core,在不具备该能力的设备上调用会失败(你可以在调用前做能力判断,避免走到 AR 逻辑)。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,

这个崩溃问题可从两方面排查解决:

  1. 环境适配问题:AREngine本身不支持模拟器运行,若你在模拟器测试,会因为底层AR服务不存在,调用"arViewController"接口时直接触发空指针或服务找不到类导致崩溃,需要更换满足官方要求的真机测试。

  2. 权限校验缺失:在调用"isARTypeSupported"前,需要先完成AREngine服务的初始化校验,未初始化就调用接口,会直接触发Native层崩溃,建议先完成"arEngine"初始化,再判断设备支持性。

我之前用模拟器跑也试过,因为官方明确要求不支持模拟器的,所以用模拟器调用崩了也只能这样,一般用户不会遇到。

Error message:the requested module '@hms:core.ar.arview' does not provide an export name 'arViewController' which imported by '&entry/src/main/ets/pages/Index&'

因为模拟器里没有 AR Engine 的底层库,未预装 AR Engine 服务,无法加载模块,所以就会崩~

可以在启动之前加入一些判断保护:

  private checkFaceARSupport(): void {
    try {
      // 官方标准调用方式
      let ret: boolean = arViewController.isARTypeSupported(arEngine.ARFeatureType.ARENGINE_FEATURE_TYPE_FACE);
      this.isFaceARSupported = ret;
      this.errorMsg = '';
      console.info('FaceAR支持状态:', ret);
    } catch (err) {
      const error = err as BusinessError;
      console.error('查询AR能力失败,错误码:', error.code, '错误信息:', error.message);
      this.isFaceARSupported = false;
      this.errorMsg = `查询失败:${error.message} (错误码:${error.code})`;
    }
  }

cke_6461.png

首先检查调用的API接口是哪个版本,对比下。

isARTypeSupported(type: arEngine.ARFeatureType): boolean起始版本是6.1.0(23)。

代码做个判断,

let res:boolean = false
if (deviceInfo.sdkApiVersion >= 23) {
  res = arViewController.isARTypeSupported(arEngine.ARFeatureType.ARENGINE_FEATURE_TYPE_FACE);
}else{
  //做个其他实现
}

你好,可能的原因是你的开发环境升级了,但是运行设备的系统没有升到 API 23。

这可能导致编译不报错,但是运行时会崩溃。

该崩溃通常因接口不兼容或未正确初始化AREngine服务导致。请确认已引入正确的OHPM依赖(如@hms.ar/ar-engine),并在运行时动态请求相机权限。此外,需在Ability对应生命周期中(如onStart/onStop)正确管理AR会话对象,确保调用arViewController前已完成必要初始化。若接口在鸿蒙Next中已变更,需参照当前API参考调整调用顺序。

在模拟器上调用 arViewController.isARTypeSupported 会直接崩溃,原因是模拟器不包含 AR Engine 系统服务,接口触发底层能力检查时因缺少对应进程而抛出致命错误。即使方法本身用于判断支持性,模拟环境下也会因服务不可用导致进程终止,而非返回 false。请确保在符合 AR Engine 硬件要求且搭载 HarmonyOS 的真机上复现,该接口才可正常工作。

回到顶部