Android NDK C++ Camera2 API问题:ACameraManager_getCameraIdList返回0个相机
解决NDK Camera2 API中ACameraManager_getCameraIdList返回0个相机的问题
看起来你在Android 7.1(API24)设备上用NDK Camera2 API遇到了相机ID列表为空的问题,我来帮你梳理下可能的原因和解决办法:
1. 优先检查相机权限(最常见原因)
API23及以上版本要求动态申请相机权限,仅仅在AndroidManifest.xml中声明权限是不够的:
- 首先确认Manifest里已经添加了权限声明:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="true" /> - 必须在调用原生相机代码之前,确保APP已经获得了相机权限。由于NDK没有直接请求权限的API,建议在Java层完成权限申请:
只有在// 在Activity中检查并请求权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 100); } else { // 权限已授予,调用你的原生相机初始化方法 yourNativeInitMethod(); }onRequestPermissionsResult中确认权限被授予后,再执行原生的相机逻辑。
2. 验证编译配置是否正确
确保你的NDK项目配置符合API24的要求:
- 在
CMakeLists.txt或Android.mk中,链接camera2ndk和android库(API24开始提供camera2ndk库):target_link_libraries(your-native-library android camera2ndk log ) - 确认
APP_PLATFORM设置为android-24或更高(比如在build.gradle中):android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' platformVersion 24 } } }
3. 排除设备硬件/系统问题
先通过Java层的Camera2 API测试设备是否能识别相机,排除硬件故障:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { String[] cameraIds = manager.getCameraIdList(); Log.d("CameraTest", "可用相机数量: " + cameraIds.length); } catch (CameraAccessException e) { e.printStackTrace(); }
如果Java层也获取不到相机ID,那大概率是设备本身的相机硬件问题,或者系统相机服务异常;如果Java层能正常获取,再回到原生代码排查。
4. 检查原生代码的细节
- 确保
m_camera_id_list的声明和使用正确,记得用完后释放资源:ACameraIdList* m_camera_id_list = nullptr; camera_status_t camera_status = ACameraManager_getCameraIdList(cameraManager, &m_camera_id_list); if (camera_status != ACAMERA_OK) { LOGE("获取相机ID列表失败,错误码: %d", camera_status); // 根据错误码排查:比如ACAMERA_ERROR_PERMISSION_DENIED就是权限问题 } else { LOGI("可用相机数量: %d", m_camera_id_list->numCameras); // 用完后必须释放列表,避免内存泄漏 ACameraManager_deleteCameraIdList(cameraManager, m_camera_id_list); } - 可以尝试在
ACameraManager_create()之后短暂延迟再调用获取ID列表的方法,避免相机服务未完全初始化(虽然概率较低,但可以试试)。
内容的提问来源于stack exchange,提问作者Hawk89




