无法通过android NDK(camera2 api)获取相机列表

2024-01-10

尝试使用 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的库,而不是24(android-28\arch-arm\usr\lib)
  • 权限:uses-permission android:name="android.permission.CAMERA"/
  • 架构:armeabi-v7a
  • jdk:jdk1.8.0_201
  • adb logcat 的链接:放在谷歌驱动器 https://drive.google.com/open?id=1KkQEKzsviVHLAlzDFFiI_EGZGW7Jmlr5由于很长,可以通过关键字“can get camera ids:”找到崩溃点

我添加到项目中的额外 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();
}

ACameraManager_getCameraIdList 返回的错误代码是-866653748,NdkCameraError.h 的值都不是这样的,奇怪

编辑:看起来索尼的手机不支持相机 API 2。如果您是,请检查此链接感兴趣的 https://forum.xda-developers.com/xperia-xz1/themes/google-camera-mods-doesnt-xperia-xz1-t3953247.


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法通过android NDK(camera2 api)获取相机列表 的相关文章

  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • Android - 在图像/缩略图上覆盖播放按钮的最佳方式

    我有一个 Android 应用程序 可以播放音频 视频并显示图片 对于视频 我想在预览图像顶部以及列表视图中叠加一个播放按钮 现在我的做法是使用 xml 中的 ImageView 然后可绘制对象是一个图层图层列表 我以编程方式定义它 因为其
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 如何在 LazyColumn 底部添加空白区域?

    我想添加 LazyColumn 的空白底部 并且我想允许用户调出底部元素 我怎样才能实现这个 Example LazyColumn modifier Modifier fillMaxWidth height 300 dp border 2
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • Android Studio - 无法解析符号“firebase”

    我目前正在将应用程序升级到新的 Firebase 版本 我按照指南进行操作 包括classpath com google gms google services 3 0 0 在我的项目 build gradle 的依赖项中以及compile
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 无法使用 Zxing Android 扫描 Code 128

    我已将 ZXing 条码阅读器集成到我的 Android 应用程序中 它可以扫描大部分代码 但我有一张电费单 它无法扫描 使用 Galaxy Ace 5 0MP 我认为问题是由于相机分辨率和焦点造成的 因为当我使用 Xperia SL 12
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 通过 Google 帐户从 Google Play 安装的应用程序列表

    以下是我的问题 是否可以通过使用任何 api 以编程方式通过 Google Play 获取用户已安装的应用程序列表 请注意 我并不是询问设备中当前安装的应用程序列表 而是询问在某个时刻已安装的应用程序列表 我需要解决上述问题 因为我正在考虑
  • 将 style="?android:attr/buttonBarStyle" 设置为父布局并将 style="?android:attr/buttonBarButtonStyle" 设置为按钮使它们不可见

    我按照Android推荐并设置style android attr buttonBarStyle 到父布局和style android attr buttonBarButtonStyle 到按钮 所以现在我的布局是这样的
  • Android:是否可以在可绘制选择器中使用字符串/枚举?

    问题 Q1 有人设法让自定义字符串 枚举属性在 xml 选择器中工作吗 我通过以下 1 获得了一个布尔属性 但不是字符串属性 编辑 感谢您的回答 目前 android 仅支持布尔选择器 原因请参阅已接受的答案 我计划实现一个复杂的自定义按钮
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐