javafx android FLAG_KEEP_SCREEN_ON

时间:2016-11-23 16:15:55

标签: android gluon javafxports

在我的应用中,我需要确保当用户点击按钮时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);
        }
    }
}

当我在三星Galaxy S5和S6上运行此代码时,我得到一个例外。 当我在android studio中本地运行它时,保持屏幕工作的代码,所以这不是问题。知道如何使这项功能工作?唤醒锁定无效,因为我需要根据UI事件启用和禁用此功能。

1 个答案:

答案 0 :(得分:0)

如果您检查例外(./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会为您提供足够的信息。如果您选中此set_node_attributes,则只需将代码移至主线程:

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