QtAndroid详解(4):JNI调用Android系统功能(1)

在Qt中,通过 Qt JNI 类库调用 Android 系统功能,判断网络状态,获取SDK版本,获取各种资源目录(外部存储、数据、图片、音乐、视频等),获取当前应用信息……
摘要由CSDN通过智能技术生成

    前面几篇我们讲解了 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;",
       
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

foruok

你可以选择打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值