如何在 Qt for android 中保持屏幕开启?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:
    使用window.callMethod<void> 代替window.callObjectMethod 在 GUI 线程上运行 QtAndroid::runOnAndroidThread 之后清除异常 要禁用始终在线行为,请使用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 权限。

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

【讨论】:

以上是关于如何在 Qt for android 中保持屏幕开启?的主要内容,如果未能解决你的问题,请参考以下文章

当我已经有 Qt for windows 32(MinGW) 时,我应该下载 Qt for Android (5.5) 吗?

Android:保持屏幕开启[重复]

Android 如何保持屏幕常亮

如何在 Qt for android 上获取应用程序参数

如何在Android中保持kivy服务在后台运行(切换到其他应用程序或锁定屏幕时服务仍然运行)?

Qt 中的qserialplot 串口通信功能如何在qt for android用?或者用Qt如何实现android版本的串口通信功能?