簡體   English   中英

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

[英]How to keep the screen on in Qt for 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<void>而不是window.callObjectMethod
  2. 使用QtAndroid::runOnAndroidThread在GUI線程上運行
  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();
    }
  });
}

您可以通過編輯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權限。

建立項目,它將工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM