【问题标题】:How to keep the screen on in Qt for android?如何在 Qt for android 中保持屏幕开启?
【发布时间】:2015-01-03 19:05:02
【问题描述】:

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

【问题讨论】:

    标签: java android c++ qt qtandroidextras


    【解决方案1】:
    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();
        }
      });
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用the 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);
              }
          }
      }
      

      【讨论】:

      • 这正是我想要的!
      • 如果我在 main() 中调用它,它会按预期工作,但如果我在插槽中调用它,它不会工作并抛出一些 java 异常。调用 exec() 后 QGuiApplication 事件循环是否移动到不同的线程。
      • 没有。 QGuiApplication 将保留在应用程序主线程中。最好在一个新的新问题中提出并描述您的问题。
      【解决方案3】:

      您可以通过编辑 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 权限。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 2013-04-06
        • 2012-05-03
        • 1970-01-01
        相关资源
        最近更新 更多