2016-11-23 6 views
1

В моем приложении мне нужно убедиться, что экран устройства Android остается включенным, когда пользователь нажимает кнопку. Когда использование нажимает на другую кнопку, я хочу разрешить экрану отключать, когда это будет нормально. Для этого мне нужно позвонить: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);javafx android 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, так что это не проблема. Любая идея, как заставить эту функциональность работать? блокировка бодрствования не будет работать, потому что мне нужно включить и отключить эту функцию на основе событий пользовательского интерфейса.

ответ

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

Thanks Jose. Код работал, за исключением того, что мне пришлось заменить лямбда на метод старого стиля. –

+0

Это не требуется ... поскольку Retrolambda также применяется к пакету Android –