无法通过android NDK获取摄像头列表(camera2 api)

无法通过android NDK获取摄像头列表(camera2 api),android,c++,qt,android-camera2,Android,C++,Qt,Android Camera2,尝试使用Qt5.12.3和android ndk构建应用程序,但无法通过“ACameraManager_getCameraIdList”获取相机列表 手机:索尼xperia XA1 Ultra Qt:5.12.3 NDK:r19c 最低目标:24 最高目标:28 Android库链接到:libcamera2ndk.so和libmediandk.so,我链接到api 28的libs,而不是24(Android-28\arch arm\usr\lib) 权限:使用权限android:name=“a

尝试使用Qt5.12.3和android ndk构建应用程序,但无法通过“ACameraManager_getCameraIdList”获取相机列表

  • 手机:索尼xperia XA1 Ultra
  • Qt:5.12.3
  • NDK:r19c
  • 最低目标:24
  • 最高目标:28
  • Android库链接到:libcamera2ndk.so和libmediandk.so,我链接到api 28的libs,而不是24(Android-28\arch arm\usr\lib)
  • 权限:使用权限android:name=“android.permission.CAMERA”/
  • 拱门:armeabi-v7a
  • jdk:jdk1.8.0_201
  • adb logcat的链接:由于它很长,您可以通过关键字“can get camera ID:”找到崩溃点
我添加到项目中的额外so文件

contains(ANDROID_TARGET_ARCH, armeabi-v7a) {
    ANDROID_EXTRA_LIBS = \
        C:/Users/yyyy/programs/Qt/android_camera/../../../3rdLibs/Android/android-ndk-r19c-windows-x86_64/android-ndk-r19c/platforms/android-28/arch-arm/usr/lib/libcamera2ndk.so
}
源代码:

#include "mainwindow.hpp"
#include <QApplication>

#include <QDebug>

#ifdef Q_OS_ANDROID

#include <android/log.h>

#include <camera/NdkCameraManager.h>

#include <QDebug>
#include <QtAndroid>
#include <QtAndroidExtras>

void myMessageHandler(
        QtMsgType type,
        const QMessageLogContext& context,
        const QString& msg
        )
{
    const char*const applicationName="android_camera";

    QString report=msg;
    if (context.file && !QString(context.file).isEmpty()) {
        report+=" in file ";
        report+=QString(context.file);
        report+=" line ";
        report+=QString::number(context.line);
    }
    if (context.function && !QString(context.function).isEmpty()) {
        report+=+" function ";
        report+=QString(context.function);
    }
    const char*const local=report.toLocal8Bit().constData();
    switch (type) {
    case QtDebugMsg:
        __android_log_write(ANDROID_LOG_DEBUG,applicationName,local);
        break;
    case QtInfoMsg:
        __android_log_write(ANDROID_LOG_INFO,applicationName,local);
        break;
    case QtWarningMsg:
        __android_log_write(ANDROID_LOG_WARN,applicationName,local);
        break;
    case QtCriticalMsg:
        __android_log_write(ANDROID_LOG_ERROR,applicationName,local);
        break;
    case QtFatalMsg:
        __android_log_write(ANDROID_LOG_FATAL,applicationName,local);
        abort();
    }
}

void open_android_camera()
{
    auto result = QtAndroid::checkPermission(QString("android.permission.CAMERA"));
    if(result == QtAndroid::PermissionResult::Denied){
        QtAndroid::PermissionResultMap resultHash =
                QtAndroid::requestPermissionsSync(QStringList({"android.permission.CAMERA"}));
        if(resultHash["android.permission.CAMERA"] == QtAndroid::PermissionResult::Denied){
            qInfo()<<__func__<<"permission deny";
        }else{
            qInfo()<<__func__<<"permission granted";
        }
    }

    qInfo()<<__func__<<"create camera manager";
    ACameraManager *camera_manager_ = ACameraManager_create();
    if(camera_manager_){
        qInfo()<<__func__<<"get camera ids";
        ACameraIdList *camera_ids = nullptr;
        auto const status = ACameraManager_getCameraIdList(camera_manager_, &camera_ids);
        qInfo()<<__func__<<"can get camera ids:"<<(camera_ids != nullptr)<<", status:"<<status;
        switch(status){
        case ACAMERA_OK:
            qInfo()<<__func__<<"ACAMERA_OK";
            break;
        case ACAMERA_ERROR_INVALID_PARAMETER:
            qInfo()<<__func__<<"ACAMERA_ERROR_INVALID_PARAMETER";
            break;
        case ACAMERA_ERROR_CAMERA_DISCONNECTED:
            qInfo()<<__func__<<"ACAMERA_ERROR_CAMERA_DISCONNECTED";
            break;
        case ACAMERA_ERROR_NOT_ENOUGH_MEMORY:
            qInfo()<<__func__<<"ACAMERA_ERROR_NOT_ENOUGH_MEMORY";
            break;
        default:
            qInfo()<<__func__<<"unknown status codes:"<<status;
        }
        if(camera_ids){
            qInfo()<<__func__<<"camera number:"<<camera_ids->numCameras;
        }
    }else{
        qInfo()<<__func__<<"cannot create camera manager";
    }
}

#endif

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

#ifdef Q_OS_ANDROID
    qInstallMessageHandler(myMessageHandler);
    open_android_camera();
#endif

    MainWindow w;
    w.show();

    return a.exec();
}
#包括“mainwindow.hpp”
#包括
#包括
#ifdef Q_OS_ANDROID

#include.

ACameraManager\u getCameraIdList
返回状态代码。返回值是什么?返回值是“-870323804”,不知道这个映射到哪个状态,会发布吗later@Michael检查头文件NdkCameraError.h,找不到类似“-870323804”的错误代码,这很奇怪,可以返回4个可能的状态代码,请把一个开关盒放在那里,弄清楚状态码是什么。我马上想到的一件事是,你完全忽略了Android活动生命周期。at示例仅在
onResume
回调中初始化相机(即当应用程序位于前台时)。您是否尝试过将摄像头访问延迟到Qt的
onResume
回调的等价项?