如何在 Qt for android 中保持屏幕常亮?

问题描述 投票:0回答:4

我找到了一些如何在 Java 中做到这一点的解决方案,但没有找到如何在 QML 或 Qt 中做到这一点。我知道首先我应该在

WAKE_LOCK
中设置
AndroidManifest.xml
权限。我应该怎么做才能在运行时从 Qt 打开和关闭屏幕锁定?

java android c++ qt qtandroidextras
4个回答
13
投票
  1. 使用
    window.callMethod<void>
    代替
    window.callObjectMethod
  2. 使用
    QtAndroid::runOnAndroidThread
  3. 在 GUI 线程上运行
  4. 事后清除异常
  5. 要禁用始终开启行为,请使用
    clearFlags

这是经过测试的Qt 5.7代码:

void keep_screen_on(bool on) {
  QtAndroid::runOnAndroidThread([on]{
    QAndroidJniObject activity = QtAndroid::androidActivity();
    if (activity.isValid()) {
      QAndroidJniObject window =
          activity.callObjectMethod("getWindow", "()Landroid/view/Window;");

      if (window.isValid()) {
        const int FLAG_KEEP_SCREEN_ON = 128;
        if (on) {
          window.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
        } else {
          window.callMethod<void>("clearFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
        }
      }
    }
    QAndroidJniEnvironment env;
    if (env->ExceptionCheck()) {
      env->ExceptionClear();
    }
  });
}

9
投票

您可以使用Qt Android Extras模块并使用JNI从C++调用相关Java函数。类似的东西:

void keepScreenOn() 
{
    QAndroidJniObject activity = QtAndroid::androidActivity();
    if (activity.isValid()) {
        QAndroidJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;");

        if (window.isValid()) {
            const int FLAG_KEEP_SCREEN_ON = 128;
            window.callObjectMethod("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
        }
    }
}

1
投票

您可以通过编辑qt本身使用的java文件来实现这一点。在android路径下src下的安装路径中,您将找到QtActivity.java文件。在 onCreate 函数中添加以下行

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

AndroidManifest.xml 中还应添加 WAKE_LOCK 权限。

构建项目,它会正常工作。


0
投票

伙计们。更新 psyched 对 Qt 6.7 的答案,经过测试的代码。在 android 13 上,我不需要在清单上包含特殊权限,但我不知道不包含它是否与旧的 android 版本兼容。

#include <QtCore/private/qandroidextras_p.h>
#include <QtCore/qjniobject.h>

void setKeepScreenOn(bool on) {
  using QNativeInterface::QAndroidApplication;
  QAndroidApplication::runOnAndroidMainThread([on] {
    QJniObject activity = QtAndroidPrivate::activity();
    if (activity.isValid()) {
      QJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;");

      if (window.isValid()) {
        const int FLAG_KEEP_SCREEN_ON = 128;
        if (on) {
          window.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
        } else {
          window.callMethod<void>("clearFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
        }
      }
    }
    QJniEnvironment env;
    if (env->ExceptionCheck()) {
      env->ExceptionClear();
    }
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.