如何在Qt中为Android保持屏幕?

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

您可以使用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. 使用window.callMethod而不是window.callObjectMethod
  2. 使用QtAndroid::runOnAndroidThread在GUI线程上运行
  3. 之后明确例外情况
  4. 要禁用always on behavior,请使用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("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON); } else { window.callMethod("clearFlags", "(I)V", FLAG_KEEP_SCREEN_ON); } } } QAndroidJniEnvironment env; if (env->ExceptionCheck()) { env->ExceptionClear(); } }); } 

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

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