Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to keep the screen on in Qt for android?

I found a couple of solutions how to do that in Java, but did not find how can I do it in QML or Qt. I know that first I should set the WAKE_LOCK permission in AndroidManifest.xml. What should I do to make it possible to turn on and off the screen locking from Qt in runtime?

like image 944
Uga Buga Avatar asked Jan 03 '15 19:01

Uga Buga


2 Answers

  1. Use window.callMethod<void> instead of window.callObjectMethod
  2. Run on GUI thread with QtAndroid::runOnAndroidThread
  3. Clear exceptions afterwards
  4. To disable always on behaviour, use clearFlags

This is tested Qt 5.7 code:

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();
    }
  });
}
like image 59
psyched Avatar answered Sep 21 '22 08:09

psyched


You can use the Qt Android Extras module and use JNI to call the relevant Java function from C++. Something like :

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);
        }
    }
}
like image 29
Nejat Avatar answered Sep 24 '22 08:09

Nejat