2015-12-09 15 views
5

Wdrażam aplikację Qt na Androida i muszę uniemożliwić przejście urządzenia w tryb gotowości (w przeciwnym razie wątki zostaną przerwane, a ponadto utracone zostanie połączenie BLE).W jaki sposób zapobiec zasypianiu urządzenia z systemem Android z aplikacji Qt

Okazało się, że na SO: How do I prevent an Android device from going to sleep programmatically?

Ten kod Java powinny być wykonywane:

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

ale jak wdrożyć że w mojej aplikacji Qt?

Odpowiedz

8

QAndroidJniObject pomaga w wykonaniu kodu Java z Qt. Pisanie to może być ciężko i trudno zorientować się, co się dzieje, gdy nie działa ....

Oto rozwiązanie (zamknięty w klasie pomocnika), aby zablokować PowerManager.WakeLock obiektu:

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

Następnie wystarczy zrobić:

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

Uwaga: Aby użyć tego kodu, musisz mieć pewność, że w manifeście masz ustawione uprawnienie WAKE_LOCK.

+0

Dziękuję, bardzo jasne i pomocne odpowiedzi. Możesz użyć 'Q_ASSERT (false)' zamiast 'assert (false);' –

1

Innym rozwiązaniem:

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

Proponuję czytać this question dla celów edukacyjnych.

+0

Widzisz ten temat i nie możesz przetłumaczyć twojego rozwiązania jako kodu używając QAndroidJniObject. Niezła odpowiedź – jpo38

Powiązane problemy