QAndroidJniObject pomaga w wykonaniu kodu Java z Qt. Pisanie to może być ciężko i trudno zorientować się, co się dzieje, gdy nie działa ....
Oto rozwiązanie (zamknięty w klasie pomocnika), aby zablokować PowerManager.WakeLock
obiektu:
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";
}
}
Następnie wystarczy zrobić:
{
KeepAwakeHelper helper;
// screen and CPU will stay awake during this section
// lock will be released when helper object goes out of scope
}
Uwaga: Aby użyć tego kodu, musisz mieć pewność, że w manifeście masz ustawione uprawnienie WAKE_LOCK.
Dziękuję, bardzo jasne i pomocne odpowiedzi. Możesz użyć 'Q_ASSERT (false)' zamiast 'assert (false);' –