QtAndroid详解(3):startActivity实战Android拍照功能

本文详细介绍了如何在Qt for Android中使用startActivity调用Android拍照功能。通过实例展示了如何构建Intent、获取Activity信息、处理拍照结果,并分析了相关源代码,涉及QAndroidJniObject、startActivity、ResultReceiver等关键概念。
摘要由CSDN通过智能技术生成

    在“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 如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLineEdit>
#include <QTextEdit>
#include <QLabel>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void onLaunch();
    void onGetActivityInfo();
    void onCapture();

private:
    QLineEdit *m_actionEdit;
    QLabel*m_activityInfo;
    QLabel *m_capturedImage;
};

#endif // WIDGET_H

    m_actionEdit 用于输入 action 。

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

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

源文件 widget.cpp

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

#include "widget.h"
#include <QtAndroid>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>
#include <QAndroidJniEnvironment>
#include <QAndroidActivityResultReceiver>
#include <QDateTime>
#include <QFile>
using namespace QtAndroid;

#define CHECK_EXCEPTION() \
    if(env->ExceptionCheck())\
    {\
        qDebug() << "exception occured";\
        env->ExceptionClear();\
    }

class ResultReceiver: public QAndroidActivityResultReceiver
{
public:
    ResultReceiver(QString imagePath, QLabel *view)
        : m_imagePath(imagePath), m_imageView(view)
    {

    }

    void handleActivityResult(
            int receiverRequestCode,
            int resultCode,
            const QAndroidJniObject & data)
    {
        qDebug() << "handleActivityResult, requestCode - " << receiverRequestCode
                    << " resultCode - " << resultCode
                    << " data - " << data.toString();
        //RESULT_OK == -1
        if(resultCode == -1 && receiverRequestCode == 1)
        {
            qDebug() << "captured image to - " << m_imagePath;
            qDebug() << "captured image exist - " << QFile::exists(m_imagePath);
            m_imageView->setPixmap(QPixmap(m_imagePath));
        }
    }

    QString m_imagePath;
    QLabel *m_imageView;
};

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QVBoxLayout *layout = new QVBoxLayout(this);

    QHBoxLayout *actInfoLayout = new QHBoxLayout();
    layout->addLayout(actInfoLayout);
    QPushButton *getBtn = new QPushButton("Get Info");
    connect(getBtn, SIGNAL(clicked()), this, SLOT(onGetActivityInfo()));
    actInfoLayout->addWidget(getBtn);
    m_activityInfo = new QLabel();
    m_activityInfo->se
  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foruok

你可以选择打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值