Android NDK C++ camera2 API: ACameraManager_getCameraIdList возвращает 0 камер

avatar
Hawk89
8 апреля 2018 в 08:25
1452
1
1

Я пытаюсь создать нативную оболочку камеры C++ для Android с помощью API-интерфейса NDK camera2 (начиная с уровня 24). Я создал фрагмент кода, используя найденный пример, скомпилировал его для целевого уровня 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;
}

Когда я запускаю этот наивный код на телефоне Xiaomi mi4c Android 7.1, я получаю пустой список камер.

Я также пытался запустить на том же телефоне фрагмент кода, созданный с помощью Java camera2 API, который делает то же самое:

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?

Источник
Olivier MATROT
15 июля 2018 в 08:53
0

Вы нашли решение своей проблемы? У меня такое же поведение с Moto E4+ под управлением Nougat 7.1.1. Вы пытались вызвать устаревший API?

Ответы (1)

avatar
Alex Cohn
8 апреля 2018 в 09:01
3

Поддержка NDK camera2 не работает, если

CameraCharacteristics.get(INFO_SUPPORTED_HARDWARE_LEVEL) == INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY

Вероятно, это случай Xiaomi mi4c.

Hawk89
9 апреля 2018 в 09:44
0

Спасибо, Алекс, но если Java camera2 API — это всего лишь оболочка JNI поверх NDK camera2, то почему он работает на том же телефоне?

Hawk89
9 апреля 2018 в 09:45
0

Есть ли другой способ интерфейса камеры телефона на С++ в случае, если INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY является поддерживаемым уровнем аппаратного обеспечения?

Alex Cohn
9 апреля 2018 в 15:13
2

Нет, camera2 API не является оболочкой JNI вокруг NDK camera2. Обратите внимание, что поддержка C для camera2 появилась намного позже и работает только на Nougat+. Я создал бэкпорт этого POC для Lollipop, но у меня никогда не было причин запускать этот код в производство. Особенно это касается уровня наследия. В этом случае camera2 полностью эмулируется в Java, который вызывает традиционный API камеры. Вы можете загрузить этот код Java с AOSP.

Bhunnu Baba
16 апреля 2020 в 14:55
0

@AlexCohn Вы уверены, что это «работает только на Nougat +»? потому что у меня есть эта проблема в oreo (версия Android 8.1.0). Для этой версии Android аппаратный уровень равен двум.

Alex Cohn
16 апреля 2020 в 18:50
1

@BhunnuBaba: Вероятно, это какая-то другая проблема. Если ваша ОС выше API 24 и HARDWARE_LEVEL ≥ 2, но API камеры NDK не указывает устройство, это может быть ошибка вашего конкретного устройства (ошибки случаются даже на API 29).