You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Qt5.12.3+Android NDK调用ACameraManager_getCameraIdList无法获取相机列表

解决ACameraManager_getCameraIdList无法获取相机列表的问题

你在使用Qt 5.12.3搭配Android NDK r19c开发应用时,碰到了ACameraManager_getCameraIdList无法获取相机列表的问题,返回的错误码-866653748甚至不在NdkCameraError.h的定义里,结合你提到的Sony Xperia XA1 Ultra设备,我来帮你梳理下问题根源和解决办法:

先明确你的环境配置

  • 设备:Sony Xperia XA1 Ultra
  • Qt版本:5.12.3
  • NDK版本:r19c
  • API级别:最小24,最大28
  • 链接库:android-28 armeabi-v7a的libcamera2ndk.so、libmediandk.so
  • 已申请android.permission.CAMERA权限
  • 额外SO配置:手动指定了NDK r19c中android-28的libcamera2ndk.so

核心问题:设备不支持Camera API 2

Sony Xperia XA1 Ultra确实仅支持Camera API 1,而ACameraManager是Camera API 2的NDK封装接口。当你在仅支持API 1的设备上调用API 2接口时,就会返回未定义的错误码(你看到的-866653748转成十六进制是0xD9000024,对应API 2的ERROR_DEPRECATED_HAL,表示相机HAL层不兼容API 2)。

具体解决方案

方案1:降级使用Camera API 1的NDK接口

如果你的应用需要兼容这款设备,建议切换到Camera API 1的NDK接口(依赖libcamera.so),常用接口包括:

  • camera_get_number_of_cameras():获取相机数量
  • camera_get_camera_info():获取相机信息
  • camera_open():打开相机

你需要修改项目链接库为libcamera.so,同时重构代码逻辑适配API 1的相机操作流程。

方案2:添加API 2兼容性检查,动态切换逻辑

在调用ACameraManager前先检查设备是否支持API 2,不支持则 fallback 到API 1:

方法1:通过QtAndroid调用Java层检查

#ifdef Q_OS_ANDROID
bool isCameraApi2Supported() {
    // 获取系统相机服务
    QAndroidJObject cameraManager = QtAndroid::androidActivity().callObjectMethod(
        "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",
        QAndroidJString("camera").object());
    if (!cameraManager.isValid()) return false;

    // 获取默认相机的API级别
    int apiLevel = cameraManager.callMethod<int>("getCameraApiLevel", "(Ljava/lang/String;)I",
        QAndroidJString("0").object());
    return apiLevel >= 2;
}
#endif

在open_android_camera()开头调用这个函数,返回false就走API 1的逻辑。

方法2:NDK层直接检查

ACameraManager *manager = ACameraManager_create();
ACameraMetadata *metadata = nullptr;
// 尝试获取默认相机的特性,失败则说明API 2不可用
status_t status = ACameraManager_getCameraCharacteristics(manager, "0", &metadata);
if (status != ACAMERA_OK) {
    // 切换到Camera API 1逻辑
}
// 记得释放资源
if (metadata) ACameraMetadata_free(metadata);
if (manager) ACameraManager_delete(manager);

额外注意点

  1. 权限时机:你的权限检查逻辑没问题,但确保权限授予后再执行相机初始化,当前同步申请权限的方式是可靠的。
  2. NDK与API匹配:NDK r19c搭配android-28库本身没问题,但设备不支持API 2的话,高版本库也无法发挥作用。
  3. 错误码解析:那个奇怪的错误码其实是API 2的ERROR_DEPRECATED_HAL,只是NDK头文件没直接定义这个值,本质就是HAL层不兼容API 2。

内容的提问来源于stack exchange,提问作者StereoMatching

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:08:24