前面几篇我们讲解了 QtAndroid 名字空间的基本用法,这次我们使用前面讲过的方法和类库,展示一些简单的小示例。我在《Qt on Android核心编程》一书中主要通过“继承 QtActivity ,实现自己的 Activity 并添加 static 方法”这种形式来调用 Android 系统的一些功能。这一系列的文章,我们主要使用 Qt 5.3 里引入的 QtAndroid 名字空间内的方法和 QAndroidJniObject 类来展示 Qt 中如何进行 JNI 调用,只在必要时才重写 QtActivity 。
Qt on Android 应用,根据你的需求,经常会调用到 Android 系统提供的一些功能,比如判断网络连接、获取外部存储路径,或者缓存文件目录等等。这些经常被朋友问到,我会在这一系列文章中慢慢把 Qt on Android 开发中经常用到的功能点都演示一下。希望对大家有所帮助。
示例介绍
示例很简单,使用 Qt Widgets 来展示。下图是效果:
如上图所示,界面非常简陋,点下 Refresh 按钮,就获取一些 Android 系统信息和当前应用的一些信息,放在 QListWidget 中。包括下面的内容:
- 手机的 Android 版本
- 网络状态和网络信息
- 手机的数据目录
- 手机外部存储目录
- 手机的照片、音乐、视频、铃声等目录
- 应用的路径
- 安装后,系统保留的 APK 的位置
- 应用的 files 目录
源码分析
代码没什么逻辑可讲……都在下面了:
#include "widget.h"
#include <QVBoxLayout>
#include <QListWidgetItem>
#include <QtAndroid>
#include <QAndroidJniEnvironment>
#include <QAndroidJniObject>
#include <QDebug>
using namespace QtAndroid;
#define CHECK_EXCEPTION() \
if(env->ExceptionCheck())\
{\
qDebug() << "exception occured";\
env->ExceptionClear();\
}
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QVBoxLayout *layout = new QVBoxLayout(this);
m_refresh = new QPushButton("Refresh");
connect(m_refresh, SIGNAL(clicked()), this, SLOT(onRefresh()));
layout->addWidget(m_refresh);
m_list = new QListWidget();
layout->addWidget(m_list, 1);
}
Widget::~Widget()
{
}
void Widget::onRefresh()
{
m_list->clear();
QAndroidJniEnvironment env;
//get Android SDK version
m_list->addItem(QString("SDK版本:%1").arg(androidSdkVersion()));
QAndroidJniObject activity = androidActivity();
//get network state
QAndroidJniObject connectivity = QAndroidJniObject::getStaticObjectField(
"android/content/Context",
"CONNECTIVITY_SERVICE",
"Ljava/lang/String;");
if(connectivity.isValid()){
qDebug() << "connectivity id - " << connectivity.toString();
CHECK_EXCEPTION()
QAndroidJniObject connectivityService = activity.callObjectMethod(
"getSystemService",
"(Ljava/lang/String;)Ljava/lang/Object;",