web-dev-qa-db-fra.com

Android - Désactiver l'affichage sans déclencher l'écran de veille / verrouillage - Activer avec l'écran tactile

J'ai essayé de trouver un moyen d'éteindre l'écran et de me réveiller lorsque l'utilisateur a touché l'écran tactile.
L'appareil est dans un environnement intégré où l'appareil est une tablette et l'utilisateur n'a accès à rien sauf à l'écran tactile (pas de boutons du tout).

Il est connecté à l'alimentation, donc la batterie ne sera pas un problème, mais lorsque je ne détecte aucune activité, je veux éteindre l'écran afin qu'il ne les regarde pas toute la journée et ne réduit pas la durée de vie du LCD rétro-éclairage.

Je garde un wakelock en permanence et décide quand me coucher.

Le problème est que lorsque j'éteins l'écran en utilisant:

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 0;
getWindow().setAttributes(params);

L'activité est interrompue et arrêtée. Et l'appareil ne répond pas à un toucher pour le réveiller. Vous devez appuyer sur le bouton d'alimentation. À ce stade, la "diapositive à déverrouiller" apparaît.

Je souhaite désactiver l'affichage, puis continuer à fonctionner pour pouvoir détecter un événement sur l'écran tactile et réactiver l'affichage.

J'ai également essayé de régler l'écran sur une luminosité de 0,1, ce qui fonctionne sur certains appareils, mais l'appareil sur lequel je dois travailler ne fait que "réduire" l'affichage.

J'ai également essayé ceci:

// First Remove my FULL wakelock

//then aquire a partial wake lock (which should turn off the display)
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");

wl.acquire();

cependant, cette méthode ne désactive pas l'affichage.

28
NebulaSleuth

Enfin compris. J'espère que ça aide. :)

  • Obtenez une instance de WindowManager.

    WindowManager windowManager = (WindowManager) Class.forName("Android.view.WindowManagerImpl").getMethod("getDefault", new Class[0]).invoke(null, new Object[0]);

  • Créer un xml de mise en page plein écran (paramètres de mise en page définis sur fill_parent)

  • Définissez votre vue comme non cliquable, non focalisable, non cliquable longtemps, etc. afin que le toucher soit transmis à votre application et que l'application puisse le détecter.

    view.setFocusable(false);
    view.setClickable(false);
    view.setKeepScreenOn(false);
    view.setLongClickable(false);
    view.setFocusableInTouchMode(false);

  • Créez un paramètre de mise en page de type Android.view.WindowManager.LayoutParams. LayoutParams layoutParams = new LayoutParams();

  • Définissez le paramètre de disposition comme la hauteur, la largeur, etc.

    layoutParams.height = LayoutParams.FILL_PARENT; 
    layoutParams.width = LayoutParams.FILL_PARENT;
    layoutParams.flags = 280; // You can try LayoutParams.FLAG_FULLSCREEN too
    layoutParams.format = PixelFormat.TRANSLUCENT; // You can try different formats
    layoutParams.windowAnimations = Android.R.style.Animation_Toast; // You can use only animations that the system to can access
    layoutParams.type = LayoutParams.TYPE_SYSTEM_OVERLAY;
    layoutParams.gravity = Gravity.BOTTOM;
    layoutParams.x = 0;
    layoutParams.y = 0;
    layoutParams.verticalWeight = 1.0F;
    layoutParams.horizontalWeight = 1.0F;
    layoutParams.verticalMargin = 0.0F;
    layoutParams.horizontalMargin = 0.0F;
    
  • Étape clé: vous pouvez définir le pourcentage de luminosité dont vous avez besoin. view.setBackgroundDrawable(getBackgroundDrawable(i));

    private Drawable getBackgroundDrawable(int i) {
    int j = 255 - (int) Math.round(255D * Math.exp(4D * ((double) i / 100D) - 4D));
    return new ColorDrawable(Color.argb(j, 0, 0, 0));}
    
  • Enfin, ajoutez la vue au gestionnaire de fenêtres que vous avez créé précédemment.

    windowManager.addView(view, layoutParams);

Remarque: Vous avez besoin de l'autorisation SYSTEM_ALERT_WINDOW Pour superposer un écran.

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/>

J'ai testé cela et cela fonctionne. Faites-moi savoir si vous êtes coincé.

7
Bharath Lakshman

Si vous avez des services, utilisez le verrouillage de réveil, mais si vous le faites du côté de l'activité, il est préférable d'utiliser des drapeaux pour acquérir le drapeau.

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // For keeping screen on
        // You can blur screen or dim screen using following flags
        // FLAG_BLUR_BEHIND -   Blur screen
        // FLAG_DIM_BEHIND - Dim Behind

Vous pouvez effacer ces indicateurs comme et imposer d'autres indicateurs pour assombrir l'écran ou le rendre flou. getWindow (). clearFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

J'espère que cela résoudra votre problème. Explorez éventuellement d'autres indicateurs à partir de http://developer.Android.com/reference/Android/view/Window.html

Il y a encore un Fyi .. Appel de l'API cachée dans Android pour éteindre l'écran

1
kodeshpa

Je ne sais pas si cela vous aide, mais vous pouvez simplement utiliser un verrou de réveil pour que votre écran continue et affiche une image qui affiche une image noire

0
Alexander Fuchs

Vous pouvez faire une chose qui est Acquérir Wakelock partiel et désactiver l'écran en utilisant:

PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 0;
getWindow().setAttributes(params);
0
Sanober Malik