当前位置:   article > 正文

QtAndroid详解(3):startActivity实战Android拍照功能_qt安卓11 匹配相机拍照

qt安卓11 匹配相机拍照

    在“QtAndroid详解(1):QAndroidJniObject”中,我们介绍了 QAndroidJniObject 这个 Qt JNI 的核心类,在“”中我们介绍了 startActivity 以及与它配套的一些 Android 背景知识,这次我们来看一个实例,演示如何使用 startActivity 来调用 Android 系统功能,同时也演示 QAndroidJniObject 的常见用法。

实例介绍

    先看下实例效果,然后再论。



    我们只是演示 API 用法,实例设计的很简单。

    第一排有个 “Get Info” 按钮,点击会获取 Qt Andorid App 所用的 Activity 的类名,如你所见,为 QtActivity 。除了 Activity 的类名,我还获取了当前 Activity 所对应的 taskId , inst 则对应于 Android Activity 的静态方法 —— getInstanceCount() 。

    第二排一个编辑框,一个 “Launch” 按钮。编辑框可以输入一个 action ,点击 Launch 按钮则调用这个 action 对应的活动。调用时不关心结果,没有提供 QAndroidActivityResultReceiver 。

    第三排是“Capture Image”按钮,点击它会调用系统的拍照功能来捕获一张图片,并将这张照片显示在界面上。这个功能,我使用 QAndroidActivityResultReceiver 来处理结果。因为拍照可能被取消。

源码分析

    介绍了示例的功能,现在来看代码吧。

    我的示例是基于 Qt Widgets 的,使用新建项目向导时,基类选择了 QWidget ,没有要 ui 文件。创建了一个 AndroidManifest.xml 文件,包名修改为 “an.qt.QtAndroid” ,添加了 android.permission.WRITE_EXTERNAL_STORAGE 和 android.permission.CAMERA 权限。详细的过程请参考“Qt on Android:图文详解Hello World全过程”和“Windows下Qt 5.2 for Android开发入门”这两篇文章吧,或者我的书《Qt on Android核心编程》。这里我们专注于 Qt JNI 部分的代码分析。

头文件widget.h

    头文件 widget.h 如下:

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include <QLineEdit>
  5. #include <QTextEdit>
  6. #include <QLabel>
  7. class Widget : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. Widget(QWidget *parent = 0);
  12. ~Widget();
  13. public slots:
  14. void onLaunch();
  15. void onGetActivityInfo();
  16. void onCapture();
  17. private:
  18. QLineEdit *m_actionEdit;
  19. QLabel*m_activityInfo;
  20. QLabel *m_capturedImage;
  21. };
  22. #endif // WIDGET_H

    m_actionEdit 用于输入 action 。

    m_activityInfo 是显示 Activity 类名等信息的。

    m_capturedImage 用来显示捕捉到的照片。

源文件 widget.cpp

    源文件 widget.cpp ,内容如下:

  1. #include "widget.h"
  2. #include <QtAndroid>
  3. #include <QPushButton>
  4. #include <QHBoxLayout>
  5. #include <QVBoxLayout>
  6. #include <QDebug>
  7. #include <QAndroidJniEnvironment>
  8. #include <QAndroidActivityResultReceiver>
  9. #include <QDateTime>
  10. #include <QFile>
  11. using namespace QtAndroid;
  12. #define CHECK_EXCEPTION() \
  13. if(env->ExceptionCheck())\
  14. {\
  15. qDebug() << "exception occured";\
  16. env->ExceptionClear();\
  17. }
  18. class ResultReceiver: public QAndroidActivityResultReceiver
  19. {
  20. public:
  21. ResultReceiver(QString imagePath, QLabel *view)
  22. : m_imagePath(imagePath), m_imageView(view)
  23. {
  24. }
  25. void handleActivityResult(
  26. int receiverRequestCode,
  27. int resultCode,
  28. const QAndroidJniObject & data)
  29. {
  30. qDebug() << "handleActivityResult, requestCode - " << receiverRequestCode
  31. << " resultCode - " << resultCode
  32. << " data - " << data.toString();
  33. //RESULT_OK == -1
  34. if(resultCode == -1 && receiverRequestCode == 1)
  35. {
  36. qDebug() << "captured image to - " << m_imagePath;
  37. qDebug() << "captured image exist - " << QFile::exists(m_imagePath);
  38. m_imageView->setPixmap(QPixmap(m_imagePath));
  39. }
  40. }
  41. QString m_imagePath;
  42. QLabel *m_imageView;
  43. };
  44. Widget::Widget(QWidget *parent)
  45. : QWidget(parent)
  46. {
  47. QVBoxLayout *layout = new QVBoxLayout(this);
  48. QHBoxLayout *actInfoLayout = new QHBoxLayout();
  49. layout->addLayout(actInfoLayout);
  50. QPushButton *getBtn = new QPushButton("Get Info");
  51. connect(getBtn, SIGNAL(clicked()), this, SLOT(onGetActivityInfo()));
  52. actInfoLayout->addWidget(getBtn);
  53. m_activityInfo = new QLabel();
  54. m_activityInfo->se
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/657943
推荐阅读
相关标签
  

闽ICP备14008679号