2015-01-03 2 views
3

Я нашел пару решений, как это сделать на Java, но не нашел, как это сделать в QML или Qt. Я знаю, что сначала я должен установить разрешение WAKE_LOCK в AndroidManifest.xml. Что я должен сделать, чтобы включить и выключить блокировку экрана из Qt во время выполнения?Как сохранить экран в Qt для Android?

ответ

6

Вы можете использовать модуль the Qt Android Extras и использовать JNI для вызова соответствующей функции Java из C++. Что-то вроде:

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. Является ли цикл события QGuiApplication перемещенным в другой поток после вызова exec(). –

+0

№ 'QGuiApplication' останется в главном потоке приложения. Может быть, лучше спросить об этом в новом новом вопросе и описать вашу проблему. – Nejat

1

Это можно сделать, отредактировав файл java, используемый самим qt. В пути установки под src в пути android вы найдете файл QtActivity.java. В OnCreate функции добавьте строку ниже, также следует добавить

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

разрешение WAKE_LOCK в AndroidManifest.xml.

Постройте проект, он будет работать нормально.

4
  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(); 
    } 
    }); 
} 
Смежные вопросы