2016-11-23 3 views
1

Dans mon application, je dois m'assurer que l'écran de l'appareil Android reste allumé lorsque l'utilisateur clique sur un bouton. Lorsque l'utilisateur clique sur un autre bouton, je souhaite que l'écran s'éteigne normalement. Pour ce faire, je dois appeler: getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);javafx android FLAG_KEEP_SCREEN_ON

La documentation android indique que cet appel doit être fait à partir d'une activité, ce que j'ai fait. Voici mon extrait de code:

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

Quand je lance ce code sur mon Samsung Galaxy S5 et S6, je reçois une exception. Le code pour garder l'écran fonctionne quand je l'exécute nativement dans un studio Android, ce n'est pas le problème. Une idée de comment faire fonctionner cette fonctionnalité? Le verrouillage du réveil ne fonctionnera pas car je dois activer et désactiver cette fonctionnalité en fonction des événements de l'interface utilisateur.

Répondre

0

Si vous cochez l'exception (./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) 

le message Only the original thread that created a view hierarchy can touch its views vous donnera assez d'informations. Si vous cochez cette question, il vous suffit de déplacer votre code pour le thread principal:

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

Merci Jose. Le code a fonctionné sauf que j'ai dû remplacer le lambda avec l'ancienne méthode de style. –

+0

Cela ne devrait pas être nécessaire ... comme Retrolambda est également appliqué au package Android –