¿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?
- Qt cómo conectar a un archivo SQLlite existente en el sistema operativo Android?
- Cómo obtener NFC trabajando en Android con Qt 5.6
- Android NDK: ¿Por qué desapareció arm-linux-androideabi-gdb.exe?
- Utiliza el tema de Holo en la aplicación Android de Qt
- Soporte de Qt Android x86_64
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?
- Qt Android: Al presionar "Hecho" no oculta el teclado
- ¿Cuál es mejor android o qt?
- Compilación de la aplicación Qt para Android usando CMake (no por Qt Creator)
- QSettings no funciona correctamente en Qt bajo Android
- Cómo configurar el uso de la cámara en Android con OpenCV + Qt5
- QML El enfoque de la cámara no funciona
- Ejecución de un software QT en Android
- Qt 5.2 y Android Error
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.
- Configuración del procesador de anotación explícita
- Obtener acceso root a través de su en el emulador de Android