使用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);
额外注意点
- 权限时机:你的权限检查逻辑没问题,但确保权限授予后再执行相机初始化,当前同步申请权限的方式是可靠的。
- NDK与API匹配:NDK r19c搭配android-28库本身没问题,但设备不支持API 2的话,高版本库也无法发挥作用。
- 错误码解析:那个奇怪的错误码其实是API 2的
ERROR_DEPRECATED_HAL,只是NDK头文件没直接定义这个值,本质就是HAL层不兼容API 2。
内容的提问来源于stack exchange,提问作者StereoMatching
相关产品推荐
相关产品推荐

