分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
在“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_OBJECTpublic: 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 - " << r