qt 6.5.1 original
53
examples/corelib/platform/androidnotifier/CMakeLists.txt
Normal file
@ -0,0 +1,53 @@
|
||||
# Copyright (C) 2022 The Qt Company Ltd.
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(androidnotifier LANGUAGES CXX)
|
||||
|
||||
if(NOT ANDROID)
|
||||
message(FATAL_ERROR "Example only works on Android")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED INSTALL_EXAMPLESDIR)
|
||||
set(INSTALL_EXAMPLESDIR "examples")
|
||||
endif()
|
||||
|
||||
find_package(Qt6 REQUIRED COMPONENTS Widgets)
|
||||
|
||||
qt_standard_project_setup()
|
||||
|
||||
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/corelib/platform/androidnotifier")
|
||||
|
||||
qt_add_executable(androidnotifier
|
||||
MANUAL_FINALIZATION
|
||||
main.cpp
|
||||
notificationclient.cpp
|
||||
notificationclient.h
|
||||
)
|
||||
|
||||
target_link_libraries(androidnotifier PRIVATE
|
||||
Qt6::Widgets
|
||||
)
|
||||
|
||||
set_property(TARGET androidnotifier APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/android)
|
||||
|
||||
qt_finalize_executable(androidnotifier)
|
||||
|
||||
set(qml_resource_files
|
||||
"images/happy.png"
|
||||
"images/sad.png"
|
||||
)
|
||||
|
||||
qt_add_resources(androidnotifier "main"
|
||||
PREFIX
|
||||
"/"
|
||||
FILES
|
||||
${qml_resource_files}
|
||||
)
|
||||
|
||||
install(TARGETS androidnotifier
|
||||
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
)
|
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.qtproject.example.androidnotifier"
|
||||
android:installLocation="auto"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0">
|
||||
<!-- The comment below will be replaced with dependencies permissions upon deployment.
|
||||
Remove the comment if you do not require these default permissions. -->
|
||||
<!-- %%INSERT_PERMISSIONS -->
|
||||
|
||||
<!-- The comment below will be replaced with dependencies permissions upon deployment.
|
||||
Remove the comment if you do not require these default features. -->
|
||||
<!-- %%INSERT_FEATURES -->
|
||||
|
||||
<supports-screens
|
||||
android:anyDensity="true"
|
||||
android:largeScreens="true"
|
||||
android:normalScreens="true"
|
||||
android:smallScreens="true" />
|
||||
<application
|
||||
android:name="org.qtproject.qt.android.bindings.QtApplication"
|
||||
android:extractNativeLibs="true"
|
||||
android:hardwareAccelerated="true"
|
||||
android:label="Qt Notifier"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:icon="@drawable/icon"
|
||||
android:allowBackup="true"
|
||||
android:fullBackupOnly="false">
|
||||
<activity
|
||||
android:name="org.qtproject.qt.android.bindings.QtActivity"
|
||||
android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
|
||||
android:label="Qt Notifier"
|
||||
android:launchMode="singleTop"
|
||||
android:screenOrientation="unspecified"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
|
||||
<meta-data
|
||||
android:name="android.app.lib_name"
|
||||
android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
|
||||
|
||||
<meta-data
|
||||
android:name="android.app.background_running"
|
||||
android:value="false"/>
|
||||
|
||||
<meta-data
|
||||
android:name="android.app.extract_android_style"
|
||||
android:value="none" />
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 13 KiB |
@ -0,0 +1,46 @@
|
||||
// Copyright (C) 2021 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
QT += core gui
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
notificationclient.cpp
|
||||
|
||||
HEADERS += \
|
||||
notificationclient.h
|
||||
|
||||
RESOURCES += \
|
||||
main.qrc
|
||||
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/corelib/platform/androidnotifier
|
||||
INSTALLS += target
|
||||
|
||||
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
|
||||
OTHER_FILES += \
|
||||
android/src/org/qtproject/example/androidnotifier/NotificationClient.java \
|
||||
android/AndroidManifest.xml
|
After Width: | Height: | Size: 47 KiB |
@ -0,0 +1,60 @@
|
||||
// Copyright (C) 2021 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
|
||||
|
||||
/*!
|
||||
\title Qt Android Notifier
|
||||
\example platform/androidnotifier
|
||||
\brief Demonstrates calling Java code from Qt in an Android application.
|
||||
|
||||
\image androidnotifier.png
|
||||
|
||||
This example demonstrates how to add a custom Java class to an Android
|
||||
application, and how to call it using the JNI convenience APIs in Qt.
|
||||
|
||||
Click on one of the smiley faces to send a notification in the status bar
|
||||
of the Android screen.
|
||||
|
||||
\include examples-run.qdocinc
|
||||
|
||||
\section1 Calling Java Methods from C++ Code
|
||||
|
||||
We define a custom Java class called \c NotificationClient in the
|
||||
NotificationClient.java file:
|
||||
|
||||
\quotefromfile platform/androidnotifier/android/src/org/qtproject/example/androidnotifier/NotificationClient.java
|
||||
\skipto org.qtproject.example.androidnotifier
|
||||
\printuntil /^\}/
|
||||
|
||||
In the NotificationClient C++ class header file, \c notificationclient.h, we
|
||||
declare a simple C++ API to display notifications on an Android device. It
|
||||
consists of a single string property, \c notification, and a slot,
|
||||
\c updateAndroidNotification(), that calls the Java code:
|
||||
|
||||
\snippet platform/androidnotifier/notificationclient.h Qt Notification Class
|
||||
|
||||
We connect the \c notificationChanged() signal to the
|
||||
\c updateAndroidNotification() slot to update the notification text when the
|
||||
\c notification text changes:
|
||||
|
||||
\snippet platform/androidnotifier/notificationclient.cpp notification changed signal
|
||||
|
||||
The \c updateAndroidNotification() function calls the Java method responsible
|
||||
for sending the notification from the Android platform APIs. First, we construct
|
||||
a Java string \c jstring from the notification string, then pass the \c jstring
|
||||
object as a parameter to the \c notify() method in Java:
|
||||
|
||||
\snippet platform/androidnotifier/notificationclient.cpp Send notification message to Java
|
||||
|
||||
The call to the Java meethod use \l QJniObject which relies on the Java Native
|
||||
Interface (JNI) APIs to communicate with Java. Also, in the previous snippet,
|
||||
we are passing the app's context object which the the static Java code can use
|
||||
to tap into the app's specific properties and APIs.
|
||||
|
||||
To make sure our smiley buttons do what they are supposed to, we add the
|
||||
the following code to change the notification text if either of them are
|
||||
clicked:
|
||||
|
||||
\snippet platform/androidnotifier/main.cpp Connect button signals
|
||||
|
||||
\sa {Qt for Android}
|
||||
*/
|
BIN
examples/corelib/platform/androidnotifier/images/happy.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
examples/corelib/platform/androidnotifier/images/sad.png
Normal file
After Width: | Height: | Size: 40 KiB |
56
examples/corelib/platform/androidnotifier/main.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
// Copyright (C) 2021 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "notificationclient.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QPushButton>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QFont>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
|
||||
QWidget widget;
|
||||
QPushButton happyButton;
|
||||
happyButton.setIcon(QIcon(":/images/happy.png"));
|
||||
happyButton.setIconSize(QSize(happyButton.width(), 120));
|
||||
|
||||
QPushButton sadButton;
|
||||
sadButton.setIcon(QIcon(":/images/sad.png"));
|
||||
sadButton.setIconSize(QSize(sadButton.width(), 120));
|
||||
|
||||
QVBoxLayout mainLayout;
|
||||
QHBoxLayout labelLayout;
|
||||
QLabel label = QLabel("Click a smiley to notify your mood");
|
||||
QFont font = label.font();
|
||||
font.setPointSize(20);
|
||||
label.setFont(font);
|
||||
labelLayout.addWidget(&label);
|
||||
labelLayout.setAlignment(Qt::AlignHCenter);
|
||||
mainLayout.addLayout(&labelLayout);
|
||||
|
||||
QHBoxLayout smileysLayout;
|
||||
smileysLayout.addWidget(&sadButton);
|
||||
smileysLayout.addWidget(&happyButton);
|
||||
smileysLayout.setAlignment(Qt::AlignCenter);
|
||||
mainLayout.addLayout(&smileysLayout);
|
||||
widget.setLayout(&mainLayout);
|
||||
|
||||
//! [Connect button signals]
|
||||
QObject::connect(&happyButton, &QPushButton::clicked, []() {
|
||||
NotificationClient().setNotification("The user is happy!");
|
||||
});
|
||||
|
||||
QObject::connect(&sadButton, &QPushButton::clicked, []() {
|
||||
NotificationClient().setNotification("The user is sad!");
|
||||
});
|
||||
//! [Connect button signals]
|
||||
|
||||
widget.show();
|
||||
return a.exec();
|
||||
}
|
||||
|
6
examples/corelib/platform/androidnotifier/main.qrc
Normal file
@ -0,0 +1,6 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>images/happy.png</file>
|
||||
<file>images/sad.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -0,0 +1,43 @@
|
||||
// Copyright (C) 2021 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "notificationclient.h"
|
||||
|
||||
#include <QtCore/qjniobject.h>
|
||||
#include <QtCore/qcoreapplication.h>
|
||||
|
||||
NotificationClient::NotificationClient(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
connect(this, &NotificationClient::notificationChanged,
|
||||
this, &NotificationClient::updateAndroidNotification);
|
||||
}
|
||||
|
||||
void NotificationClient::setNotification(const QString ¬ification)
|
||||
{
|
||||
if (m_notification == notification)
|
||||
return;
|
||||
|
||||
//! [notification changed signal]
|
||||
m_notification = notification;
|
||||
emit notificationChanged();
|
||||
//! [notification changed signal]
|
||||
}
|
||||
|
||||
QString NotificationClient::notification() const
|
||||
{
|
||||
return m_notification;
|
||||
}
|
||||
|
||||
//! [Send notification message to Java]
|
||||
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>());
|
||||
}
|
||||
//! [Send notification message to Java]
|
@ -0,0 +1,29 @@
|
||||
// Copyright (C) 2021 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef NOTIFICATIONCLIENT_H
|
||||
#define NOTIFICATIONCLIENT_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
//! [Qt Notification Class]
|
||||
class NotificationClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit NotificationClient(QObject *parent = 0);
|
||||
|
||||
void setNotification(const QString ¬ification);
|
||||
QString notification() const;
|
||||
|
||||
signals:
|
||||
void notificationChanged();
|
||||
|
||||
private slots:
|
||||
void updateAndroidNotification();
|
||||
|
||||
private:
|
||||
QString m_notification;
|
||||
};
|
||||
//! [Qt Notification Class]
|
||||
#endif // NOTIFICATIONCLIENT_H
|