【问题标题】:Android NDK C++ camera2 API: ACameraManager_getCameraIdList return 0 camerasAndroid NDK C++ camera2 API:ACameraManager_getCameraIdList 返回 0 个摄像头
【发布时间】:2018-04-09 15:40:38
【问题描述】:

我正在尝试使用 NDK camera2 API(来自 abi 级别 24)创建 C++ Android 原生相机包装器。我使用找到的示例创建了一些 sn-p 代码,并将其编译为目标 API 级别 24,并在 Android 7.1 手机上运行:

ACameraManager *cameraManager = ACameraManager_create();
VB(cameraManager!=nullptr, "Could not create CameraManager.");
camera_status = ACameraManager_getCameraIdList(cameraManager, &m_camera_id_list);

if (camera_status != ACAMERA_OK) {

    LOGE("Failed to get camera id list (reason: %d)\n", camera_status);
    return ERR_CAMERAAPI_UNKNOWN_ERROR;
}

if (m_camera_id_list->numCameras < 1) {
    LOGE("No camera device detected.\n");
    return ERR_CAMERAAPI_UNKNOWN_ERROR;
}

当我在小米 mi4c Android 7.1 手机上运行这个简单的代码时,我得到一个空的相机列表。

我还尝试在同一部手机上运行使用 Java camera2 API 创建的 sn-p,它执行相同的操作:

import android.hardware.camera2.CameraDevice; 
Activity activity = getActivity();
CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);

String[] cameraIds = manager.getCameraIdList()
manager.openCamera(cameraIds[0], mStateCallback, mBackgroundHandler);

这一次我在逻辑上看到它实际上找到了两个相机并打印它们的分辨率。

我的清单当然包含以下几行:

<uses-sdk android:minSdkVersion="24" />
<uses-feature android:name="android.hardware.camera2" android:required="true" />
<uses-feature android:name="android.hardware.sensor.gyroscope" android:required="false" />
<uses-permission android:name="android.permission.CAMERA"/>

我批准了权限请求。

有谁知道为什么在使用 Java camera2 API 时会找到手机摄像头,但在使用 NDK camera2 API 时却找不到?

【问题讨论】:

  • 您找到解决问题的方法了吗?我与运行 Nougat 7.1.1 的 Moto E4+ 有相同的行为。您是否尝试过调用旧版 API?

标签: android api android-ndk android-camera2


【解决方案1】:

如果

,NDK camera2 支持将不起作用
CameraCharacteristics.get(INFO_SUPPORTED_HARDWARE_LEVEL) == INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY

小米mi4c大概就是这样。

【讨论】:

  • 谢谢 Alex,但如果 Java camera2 API 只是 NDK camera2 之上的 JNI 包装器,那么它怎么能在同一部手机上工作呢?
  • 如果 INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY 是受支持的硬件级别,是否有另一种方法可以在 C++ 中连接手机摄像头?
  • 不,camera2 API 不是 NDK camera2 的 JNI 包装器。请注意,camera2 的 C 支持出现得很晚,并且仅适用于 Nougat+。我已经为 Lollipop 构建了一个 POC 反向移植,但我从来没有理由将此代码投入生产。尤其是这涉及到遗留级别。在这种情况下,camera2 完全用 Java 模拟,调用传统的 Camera API。您可以从 AOSP 下载此 Java 代码。
  • @AlexCohn 你确定这个“只适用于牛轧糖+”吗?,因为我在奥利奥(android 版本 8.1.0)中有这个问题。对于这个 android 版本,硬件级别是两个。
  • @BhunnuBaba:这可能是一些不同的问题。如果您的操作系统高于 API 24 且 HARDWARE_LEVEL ≥ 2,但 NDK 相机 API 未列出设备,则可能是您的特定设备的错误(即使在 API 29 上也会出现错误)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多