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

Uga*_*uga 7 c++ java qt android qtandroidextras

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

Nej*_*jat 9

您可以使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


psy*_*hed 8

  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();
    }
  });
}
Run Code Online (Sandbox Code Playgroud)