Qt Android 通知器

演示如何在 Android 应用中从 Qt 调用 Java 代码。

此示例演示了如何将自定义 Java 类添加到 Android 应用,以及如何使用 Qt 的 JNI 便捷 API 调用它。

单击其中一个笑脸图标,在 Android 屏幕的状态栏中发送通知。

运行示例

要从 Qt Creator 运行此示例,打开 欢迎使用 模式并从 示例 中选择示例。有关更多信息,请访问 构建和运行示例

从 C++ 代码调用 Java 方法

我们在 NotificationClient.java 文件中定义了一个名为 NotificationClient 的自定义 Java 类

package org.qtproject.example.androidnotifier;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.BitmapFactory;
import android.app.NotificationChannel;

public class NotificationClient
{
    public static void notify(Context context, String message) {
        try {
            NotificationManager m_notificationManager = (NotificationManager)
                    context.getSystemService(Context.NOTIFICATION_SERVICE);

            Notification.Builder m_builder;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                int importance = NotificationManager.IMPORTANCE_DEFAULT;
                NotificationChannel notificationChannel;
                notificationChannel = new NotificationChannel("Qt", "Qt Notifier", importance);
                m_notificationManager.createNotificationChannel(notificationChannel);
                m_builder = new Notification.Builder(context, notificationChannel.getId());
            } else {
                m_builder = new Notification.Builder(context);
            }

            Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);
            m_builder.setSmallIcon(R.drawable.icon)
                    .setLargeIcon(icon)
                    .setContentTitle("A message from Qt!")
                    .setContentText(message)
                    .setDefaults(Notification.DEFAULT_SOUND)
                    .setColor(Color.GREEN)
                    .setAutoCancel(true);

            m_notificationManager.notify(0, m_builder.build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在 NotificationClient C++ 类头文件 notificationclient.h 中,我们声明了一个简单的 C++ API 来在 Android 设备上显示通知。它由一个字符串属性 notification 和一个槽 updateAndroidNotification() 组成,该槽调用 Java 代码

class NotificationClient : public QObject
{
    Q_OBJECT
public:
    explicit NotificationClient(QObject *parent = 0);

    void setNotification(const QString &notification);
    QString notification() const;

signals:
    void notificationChanged();

private slots:
    void updateAndroidNotification();

private:
    QString m_notification;
};

我们将 notificationChanged() 信号连接到 updateAndroidNotification() 槽,以便在 notification 文本更改时更新通知文本

    m_notification = notification;
    emit notificationChanged();

updateAndroidNotification() 函数调用负责从 Android 平台 API 发送通知的 Java 方法。首先,我们从通知字符串构造一个 Java 字符串 jstring,然后调用 Java 中的 notify() 方法,将 jstring 对象作为参数传递

void NotificationClient::updateAndroidNotification()
{
    QJniObject javaNotification = QJniObject::fromString(m_notification);
    QJniObject::callStaticMethod<void>(
                    "org/qtproject/example/androidnotifier/NotificationClient",
                    "notify",
                    "(Landroid/content/Context;Ljava/lang/String;)V",
                    QNativeInterface::QAndroidApplication::context(),
                    javaNotification.object<jstring>());
}

调用 Java 方法使用 QJniObject,它依赖于 Java 本地接口 (JNI) API 进行通信。同样,在先前的代码片段中,我们传递了应用上下文对象,静态 Java 代码可以使用它来访问应用特定的属性和 API。

为了确保笑脸按钮按预期工作,我们添加了以下代码,如果点击其中任意一个笑脸,则更改通知文本

    QObject::connect(&happyButton, &QPushButton::clicked, &happyButton, []() {
        NotificationClient().setNotification("The user is happy!");
    });

    QObject::connect(&sadButton, &QPushButton::clicked, &happyButton, []() {
        NotificationClient().setNotification("The user is sad!");
    });

示例项目 @ code.qt.io

另请参阅 Qt for Android.

© 2024 Qt 公司有限公司。此处包含的文档贡献权归其各自的所有者所有。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款提供的。Qt 和相关商标是芬兰的 Qt 公司及其它国家和地区的商标。所有其他商标均为其各自所有者的财产。