7

我找到了几个如何在 Java 中做到这一点的解决方案,但没有找到如何在 QML 或 Qt 中做到这一点。我知道首先我应该WAKE_LOCKAndroidManifest.xml. 我应该怎么做才能在运行时从 Qt 打开和关闭屏幕锁定?

4

3 回答 3

10
  1. 使用window.callMethod<void>代替window.callObjectMethod
  2. 在 GUI 线程上运行QtAndroid::runOnAndroidThread
  3. 之后清除异常
  4. 要禁用始终开启行为,请使用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();
    }
  });
}
于 2016-08-09T09:08:17.880 回答
8

您可以使用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);
        }
    }
}
于 2015-01-04T06:33:30.567 回答
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 权限。

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

于 2015-01-04T07:52:02.113 回答