¿Cómo evito que un dispositivo Android se vaya a dormir desde la aplicación Qt

Estoy implementando una aplicación Qt en Android y necesito evitar que el dispositivo se ponga en espera (de lo contrario, mis hilos se interrumpen y también se pierde mi conexión BLE).

Encontré eso en SO: ¿Cómo evito que un dispositivo androide se vaya a dormir programáticamente?

Este código Java debe ejecutarse:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); wl.acquire(); // screen and CPU will stay awake during this section wl.release(); 

Pero, ¿cómo implementar eso en mi aplicación Qt?

QAndroidJniObject ayuda a ejecutar código Java desde Qt. Escritura que podría ser difícil y es difícil de averiguar lo que está mal cuando no funciona ….

Esta es la solución (encapsulada en una clase auxiliar) para bloquear un objeto PowerManager.WakeLock :

LockHelper.h:

 #pragma once #include <QAndroidJniObject> class KeepAwakeHelper { public: KeepAwakeHelper(); virtual ~KeepAwakeHelper(); private: QAndroidJniObject m_wakeLock; }; 

LockHelper.cpp:

 #include "LockHelper.h" #include <QAndroidJniObject> #include <QDebug> #include "jni.h" KeepAwakeHelper::KeepAwakeHelper() { QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); if ( activity.isValid() ) { QAndroidJniObject serviceName = QAndroidJniObject::getStaticObjectField<jstring>("android/content/Context","POWER_SERVICE"); if ( serviceName.isValid() ) { QAndroidJniObject powerMgr = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",serviceName.object<jobject>()); if ( powerMgr.isValid() ) { jint levelAndFlags = QAndroidJniObject::getStaticField<jint>("android/os/PowerManager","SCREEN_DIM_WAKE_LOCK"); QAndroidJniObject tag = QAndroidJniObject::fromString( "My Tag" ); m_wakeLock = powerMgr.callObjectMethod("newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;", levelAndFlags,tag.object<jstring>()); } } } if ( m_wakeLock.isValid() ) { m_wakeLock.callMethod<void>("acquire", "()V"); qDebug() << "Locked device, can't go to standby anymore"; } else { assert( false ); } } KeepAwakeHelper::~KeepAwakeHelper() { if ( m_wakeLock.isValid() ) { m_wakeLock.callMethod<void>("release", "()V"); qDebug() << "Unlocked device, can now go to standby"; } } 

Entonces, simplemente haga:

 { KeepAwakeHelper helper; // screen and CPU will stay awake during this section // lock will be released when helper object goes out of scope } 

Nota: Debe asegurarse de que tiene el permiso WAKE_LOCK establecido en su manifiesto para poder utilizar este código.

Otra solución:

 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { QAndroidJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;"); if (window.isValid()) { const int FLAG_KEEP_SCREEN_ON = 128; window.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON); } } 

Fuente aquí

Le sugiero que lea esta pregunta con fines educativos.

  • Qt en android, reduciendo el tamaño binario
  • Crear un archivo en diferentes teléfonos móviles en Qt
  • No se puede emitir señal en Android
  • Cómo pedir qt crear paquete apk para android sin iniciar un simulador
  • Aplicaciones multipágina en QML
  • Botón General Share en Android en Qt Quick
  • Cómo integrar OpenCV en el proyecto Qt Creator Android
  • Adjuntar al proceso de Android desde Qt Creator
  • Qt: Cómo configurar el icono de la aplicación en Android e iOS
  • Qt / QML Android mejor práctica para enviar un intento personalizado (compartir URL)
  • QNetwork error cuando se utiliza Qt lib con la aplicación JNI Android nativa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.