2015-01-03 31 views
3

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

回答

6

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

这正是我正在寻找的! –

+0

如果我在main()中调用它,它按预期工作,但是如果我在一个插槽中调用它,它不工作并抛出一些java异常。在调用exec()之后,QGuiApplication事件循环移动到不同的线程。 –

+0

编号'QGuiApplication'将保留在应用程序主线程中。可能最好在新的新问题中提出并描述你的问题。 – Nejat

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权限。

建立该项目,它会正常工作。而不是用QtAndroid::runOnAndroidThread

  • 清除异常之后
  • 要在行为总是禁用GUI线程window.callObjectMethod
  • 运行

  • 4
    1. 使用window.callMethod<void>,使用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(); 
        } 
        }); 
    }