gpt4 book ai didi

android - 如何防止 Android 设备从 Qt 应用程序进入休眠状态

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:08:20 24 4
gpt4 key购买 nike

我正在 Android 上部署 Qt 应用程序,需要防止设备进入待机状态(否则,我的线程会中断,而且我的 BLE 连接也会丢失)。

我在 SO 上发现:How do I prevent an Android device from going to sleep programmatically?

应执行此 Java 代码:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

但是如何在我的 Qt 应用程序中实现它呢?

最佳答案

QAndroidJniObject帮助从 Qt 执行 Java 代码。编写它可能很困难,而且当它不起作用时很难找出问题所在....

下面是锁定 PowerManager.WakeLock 对象的解决方案(封装在辅助类中):

锁助手.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";
}
}

然后,简单地做:

{
KeepAwakeHelper helper;
// screen and CPU will stay awake during this section
// lock will be released when helper object goes out of scope
}

注意:您需要确保拥有 WAKE_LOCK在您的 list 中设置权限以使用此代码。

关于android - 如何防止 Android 设备从 Qt 应用程序进入休眠状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34179653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com