javafx андроид FLAG_KEEP_SCREEN_ON

В моем приложении мне нужно убедиться, что экран устройства Android остается включенным, когда пользователь нажимает кнопку. Когда пользователь нажимает другую кнопку, я хочу, чтобы экран выключался, как обычно. Для этого мне нужно позвонить: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

В документации Android указано, что этот вызов должен быть сделан из действия, что я и сделал. Вот мой фрагмент кода:

public class AndroidDataProvider implements DataProvider {
    @Override
    public void keepScreenOn(boolean flag) {
        if(flag) {
            Window window = FXActivity.getInstance().getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
        else {
            Window window = FXActivity.getInstance().getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    }
}

Когда я запускаю этот код на своих Samsung Galaxy S5 и S6, я получаю исключение. Код для включения экрана работает, когда я запускаю его изначально в студии Android, так что это не проблема. Любая идея, как заставить эту функцию работать? блокировка пробуждения не будет работать, потому что мне нужно включать и отключать эту функцию на основе событий пользовательского интерфейса.


person Harry Mitchell    schedule 23.11.2016    source источник


Ответы (1)


Если вы проверите исключение (./adb logcat -v threadtime):

AndroidRuntime: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
AndroidRuntime:     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6855)
AndroidRuntime:     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1040)
AndroidRuntime:     at android.view.View.requestLayout(View.java:19657)
AndroidRuntime:     at android.view.View.setLayoutParams(View.java:13247)
AndroidRuntime:     at android.view.WindowManagerGlobal.updateViewLayout(WindowManagerGlobal.java:365)
AndroidRuntime:     at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:99)
AndroidRuntime:     at android.app.Activity.onWindowAttributesChanged(Activity.java:2867)
AndroidRuntime:     at android.view.Window.dispatchWindowAttributesChanged(Window.java:1098)
AndroidRuntime:     at com.android.internal.policy.PhoneWindow.dispatchWindowAttributesChanged(PhoneWindow.java:2998)
AndroidRuntime:     at android.view.Window.setFlags(Window.java:1075)
AndroidRuntime:     at android.view.Window.addFlags(Window.java:1033)

сообщение Only the original thread that created a view hierarchy can touch its views даст вам достаточно информации. Если вы проверите это вопрос, вам просто нужно переместить свой код в основной поток:

    FXActivity.getInstance().runOnUiThread(() -> {
        Window window = FXActivity.getInstance().getWindow();
        if (flag) {
            window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        } else {
            window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    });
person José Pereda    schedule 23.11.2016
comment
Спасибо Хосе. Код работал, за исключением того, что мне пришлось заменить лямбду методом старого стиля. - person Harry Mitchell; 28.11.2016
comment
Этого не требуется... так как Retrolambda применяется и к пакету Android. - person José Pereda; 28.11.2016