2016-11-23 51 views
1

在我的应用程序中,我需要确保Android设备的屏幕保持在用户单击按钮时。当用户点击另一个按钮时,我想让屏幕在正常情况下关闭。要做到这一点,我需要拨打: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);javafx android FLAG_KEEP_SCREEN_ON

android文档指出这个调用必须由一个activity完成,这就是我所做的。这里是我的代码片段:

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事件启用和禁用此功能。

回答

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会给你足够的信息。如果您检查此question,您只需将您的代码移动到主线程:

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

谢谢何塞。代码工作,除了我不得不用老样式方法替换lambda。 –

+0

不应该要求...因为Retrolambda也适用于Android包 –