无法通过android NDK获取摄像头列表(camera2 api)
尝试使用Qt5.12.3和android ndk构建应用程序,但无法通过“ACameraManager_getCameraIdList”获取相机列表无法通过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
- 手机:索尼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:”找到崩溃点
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
回调的等价项?