Qt Android блокировки экрана проблема Java

У меня есть приложение Qt, и мне нужно, чтобы экран не затемнялся во время работы приложения. Я поместил следующий код в начало main () в main.cpp:

#ifdef ANDROID
// disable screen lock on android devices
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.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
}
}
#endif

Который в значительной степени пришел от: Как сохранить экран в Qt для Android?, кроме того, что я использую callMethod<void> вместо callObjectMethod,

Проблема в том, что когда приложение запускается, оно падает с огромным журналом Java, я подозреваю, что это важная часть:

F/art     (26455): art/runtime/runtime.cc:289] Pending exception android.view.ViewRootImpl$CalledFromWrongThreadException thrown by 'unknown throw location'
F/art     (26455): art/runtime/runtime.cc:289] android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.ViewRootImpl.checkThread() (ViewRootImpl.java:6357)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.ViewRootImpl.requestLayout() (ViewRootImpl.java:874)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.View.requestLayout() (View.java:17476)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.View.setLayoutParams(android.view.ViewGroup$LayoutParams) (View.java:11477)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.WindowManagerGlobal.updateViewLayout(android.view.View, android.view.ViewGroup$LayoutParams) (WindowManagerGlobal.java:305)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.WindowManagerImpl.updateViewLayout(android.view.View, android.view.ViewGroup$LayoutParams) (WindowManagerImpl.java:91)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.app.Activity.onWindowAttributesChanged(android.view.WindowManager$LayoutParams) (Activity.java:2596)
F/art     (26455): art/runtime/runtime.cc:289]   at void org.qtproject.qt5.android.bindings.QtActivity.onWindowAttributesChanged(android.view.WindowManager$LayoutParams) (QtActivity.java:1385)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.Window.dispatchWindowAttributesChanged(android.view.WindowManager$LayoutParams) (Window.java:836)
F/art     (26455): art/runtime/runtime.cc:289]   at void com.android.internal.policy.impl.PhoneWindow.dispatchWindowAttributesChanged(android.view.WindowManager$LayoutParams) (PhoneWindow.java:3993)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.Window.setFlags(int, int) (Window.java:813)
F/art     (26455): art/runtime/runtime.cc:289]   at void android.view.Window.addFlags(int) (Window.java:771)

Я добавил правильное разрешение (android.permission.WAKE_LOCK) в AndroidManifest.xml. Кажется, проблема вызвана тем, что addFlags () запускается за пределами основного представления? Я немного погуглил и не смог найти никого другого, имеющего такую ​​же проблему.

Спасибо,
Иван

1

Решение

#if defined(Q_OS_ANDROID)
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.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
}
QAndroidJniEnvironment env; if (env->ExceptionCheck()) { env->ExceptionClear(); } //Clear any possible pending exceptions.
}
#endif

Получил от Вот, у меня на 5.1 андроиде работает хорошо

1

Другие решения

При развертывании на Android Qt фактически не запускается в потоке основного приложения (Java). Как android.view.Window.addFlags должен вызываться из основного потока Java, вам будет трудно вернуться в этот поток, чтобы этот код работал.

Лучше всего использовать WakeLock чтобы система не переходила в спящий режим. вот пост, объясняющий, как это сделать.

Это предотвратит затемнение экрана во время работы приложения.

0

В итоге я сделал это на Java.

Вот код Java:

package org.qtproject.visualization;

import org.qtproject.qt5.android.bindings.*;
import android.os.Bundle;
import android.view.WindowManager;

public class ScreenOnActivity extends QtActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON );
super.onCreate(savedInstanceState);
}
}

Затем он интегрируется в остальную часть приложения.

0
По вопросам рекламы [email protected]