QAndroidJniObject hilft beim Ausführen von Java-Code aus Qt. Writting es könnte schwierig sein, und es ist schwer, herauszufinden, was falsch ist, wenn es nicht funktioniert ....
Hier ist die Lösung (in einer Hilfsklasse gekapselt) ein PowerManager.WakeLock
Objekt zu sperren:
LockHelper.h :
#pragma once
#include <QAndroidJniObject>
class KeepAwakeHelper
{
public:
KeepAwakeHelper();
virtual ~KeepAwakeHelper();
private:
QAndroidJniObject m_wakeLock;
};
LockHelper.cpp:
#include "LockHelper.h"
#include <QAndroidJniObject>
#include <QDebug>
#include "jni.h"
KeepAwakeHelper::KeepAwakeHelper()
{
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if (activity.isValid())
{
QAndroidJniObject serviceName = QAndroidJniObject::getStaticObjectField<jstring>("android/content/Context","POWER_SERVICE");
if (serviceName.isValid())
{
QAndroidJniObject powerMgr = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",serviceName.object<jobject>());
if (powerMgr.isValid())
{
jint levelAndFlags = QAndroidJniObject::getStaticField<jint>("android/os/PowerManager","SCREEN_DIM_WAKE_LOCK");
QAndroidJniObject tag = QAndroidJniObject::fromString("My Tag");
m_wakeLock = powerMgr.callObjectMethod("newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;", levelAndFlags,tag.object<jstring>());
}
}
}
if (m_wakeLock.isValid())
{
m_wakeLock.callMethod<void>("acquire", "()V");
qDebug() << "Locked device, can't go to standby anymore";
}
else
{
assert(false);
}
}
KeepAwakeHelper::~KeepAwakeHelper()
{
if (m_wakeLock.isValid())
{
m_wakeLock.callMethod<void>("release", "()V");
qDebug() << "Unlocked device, can now go to standby";
}
}
dann einfach tun:
{
KeepAwakeHelper helper;
// screen and CPU will stay awake during this section
// lock will be released when helper object goes out of scope
}
Hinweis: Sie müssen sicherstellen, dass Sie die Berechtigung WAKE_LOCK in Ihrem Manifest haben, um diesen Code zu verwenden.
Vielen Dank, sehr klar und so hilfreiche Antwort. Sie können 'Q_ASSERT (false)' anstelle von 'assert (false) verwenden;' –