2015-12-09 8 views
5

in den Ruhezustand versetzt Ich bin eine Qt-Anwendung auf Android bereitstellen und müssen das Gerät in den Standby-Modus gehen (sonst meine Threads unterbrochen werden und auch meine BLE-Verbindung verloren geht)).Wie kann ich verhindern, dass ein Android-Gerät von Qt-Anwendung

fand ich, dass auf SO: How do I prevent an Android device from going to sleep programmatically?

Dieser Java-Code ausgeführt werden soll:

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(); 

Aber wie das in meiner Qt-Anwendung zu implementieren?

Antwort

8

QAndroidJniObject hilft beim Ausführen von Java-Code aus Qt. Writting es könnte schwierig sein, und es ist schwer, herauszufinden, was falsch ist, wenn es nicht funktioniert ....

Hier ist die Lösung (in einer Hilfsklasse gekapselt) ein PowerManager.WakeLock Objekt zu sperren:

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"; 
    } 
} 

dann einfach tun:

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

Hinweis: Sie müssen sicherstellen, dass Sie die Berechtigung WAKE_LOCK in Ihrem Manifest haben, um diesen Code zu verwenden.

+0

Vielen Dank, sehr klar und so hilfreiche Antwort. Sie können 'Q_ASSERT (false)' anstelle von 'assert (false) verwenden;' –

1

Eine andere Lösung:

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); 
    } 
} 

Source here

Ich schlage vor, Sie this question für pädagogische Zwecke zu lesen.

+0

Dieses Thema gesehen und konnte Ihre Lösung nicht mit QAndroidJniObject als Code übersetzen. Gute Antwort – jpo38

Verwandte Themen