You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.txtAndroid.mk中,链接camera2ndkandroid库(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

火山引擎 最新活动