web-dev-qa-db-fra.com

Comment verrouiller l'écran Android via ADB?

Existe-t-il un moyen de verrouiller l'écran Android via l'ADB?

Je trouve des moyens de verrouiller l'affichage dans un apk, mais je veux verrouiller l'écran du PC via ADB, pour simuler un délai d'affichage, sans avoir à attendre le délai.

Est-il possible de faire cela?

Merci, Diane

43
PurpleDiane

Cool, je viens de trouver KEYCODE_POWER qui est 26.

donc ça marche en envoyant:

adb Shell input keyevent 26

qui verrouille l'écran si l'écran est déverrouillé. Si l'écran est déjà verrouillé, il réveille l'appareil.

Je suppose que la seule façon de s'assurer que l'écran est verrouillé (désactivé) est de le déverrouiller (nous utilisons keyevent 82 (menu), puis de le verrouiller avec le bouton d'alimentation keyevent. Quelqu'un a-t-il une idée si c'est vrai?

65
PurpleDiane

Michael R. Hines a donné ce qui est sans doute la solution la plus simple. Cependant, la ligne suivante n'est pas utile dans les versions ultérieures d'Android.

adb Shell input keyevent 82 # unlock

J'ai mis à jour le script Shell en utilisant les coordonnées de l'appareil individuel que je veux réveiller (tablette). Ma tablette ne prend pas en charge les changements d'orientation pour les événements d'écran de verrouillage, donc les valeurs fonctionnent toujours car l'écran de verrouillage est toujours en mode paysage. Si vous avez besoin d'une détection de changement d'orientation, un simple si/alors/autre suffirait pour choisir les coordonnées correctes à utiliser pour l'orientation.

#!/bin/bash
if [ "$(adb Shell dumpsys power | grep mScreenOn= | grep -oE '(true|false)')" == false ] ; then
    echo "Screen is off. Turning on."
    adb Shell input keyevent 26 # wakeup
    adb Shell input touchscreen swipe 930 380 1080 380 # unlock
    echo "OK, should be on now."
else 
    echo "Screen is already on."
    echo "Turning off."
    adb Shell input keyevent 26 # sleep
fi
15
Rescue9

Voici le tout dans un seul script bash qui vérifie si l'écran est réellement allumé ou non, puis se réveille et déverrouille l'écran en une seule fois:

if [ "$(adb Shell dumpsys power | grep mScreenOn= | grep -oE '(true|false)')" == false ] ; then
    echo "Screen is off. Turning on."
    adb Shell input keyevent 26 # wakeup
    adb Shell input keyevent 82 # unlock
    echo "OK, should be on now."
else 
    echo "Screen is already on."
fi
9
Michael R. Hines

Vous avez déjà trouvé une solution, mais je vais quand même mettre ce code ici pour référence.

Ce que vous pourriez faire est d'injecter l'événement pour "appuyer" deux fois sur le bouton d'alimentation. Si vous ne connaissez pas l'état de l'appareil (affichage activé/désactivé), vérifiez si l'écran est actuellement allumé ou éteint et appuyez sur le bouton d'alimentation en conséquence.

Voici un simple script monkeyrunner:

import re
from Java.util import *
from com.Android.monkeyrunner import MonkeyRunner, MonkeyDevice
device = MonkeyRunner.waitForConnection()       # connect to a device
device.Shell("input keyevent KEYCODE_POWER")    # turn screen off (or on?)
res = device.Shell("dumpsys power")             # fetch power state
m = re.search(r'.*mPowerState=([0-9]+).*', res) # parse the string
if m and int(m.group(1)) == 0:                  # screen is off
  device.Shell("input keyevent KEYCODE_POWER")  # turn the screen on
5
Jakub Czaplicki

En plus des réponses précédentes, voici ce que je fais pour verrouiller/déverrouiller mon écran en utilisant adb:

adb Shell input keyevent 26 verrouillera l'écran.
Donc, si vous exécutez à nouveau cette commande, alors que l'écran est éteint/verrouillé, il sera allumé/déverrouillé.
adb Shell input keyevent 26 déverrouillera également l'écran (si l'écran est verrouillé).

De plus, j'ai également testé toutes les commandes, telles que adb Shell input keyevent number, et a découvert que adb Shell input keyevent 3 déverrouille également l'appareil.

J'avais également découvert (en testant) que la touche 3 était le bouton d'accueil. Donc, si vous avez un bouton d'accueil physique (pas le bouton d'accueil doux à l'écran), vous pouvez également l'utiliser pour déverrouiller votre appareil.

3
Lloyd Dominic

Vous pouvez utiliser la commande suivante pour déclencher l'affichage ON. adb Shell entrée keyevent POWER

J'ai essayé et j'utilise dans mon projet, j'espère que cela fonctionnera pour vous.

Et voici le code Ruby que j'ai utilisé:

def ScreenCheck()
system("adb Shell dumpsys power > c:/interact.log")

File.open("C:\\interact.log").each do |line|
    if line[/mScreenOn/]
        if line.strip == "mScreenOn=true"
            p "Screen is On, Starting execution.."
        else
            p "Screen is Off, starting screen.."
            system("adb Shell input keyevent = POWER")
            p "Starting execution.."
        end
    end
end
end
1
Swapan Chhabra

Pour ceux qui utilisent des versions antérieures de Android (4.2+ au moins), dumpsys power a une sortie différente.
À la place d'utiliser mPowerState= comme réponse donnée par @ Jakub Czaplicki , j'ai utilisé mScreenOn=.

p = Runtime.getRuntime().exec("su", null, null);
OutputStream o = p.getOutputStream();
o.write(("dumpsys power").getBytes("ASCII"));
o.flush();
o.close();
p.waitFor();

boolean screenState;
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((res = in.readLine()) != null) dump += res;
screenState = dump.charAt( dump.indexOf("mScreenOn=") + 10 ) == 't';

screenState est true (écran sur ), ou false (écran éteint ).

1
António Almeida

Voici un script pour allumer/éteindre l'écran pour chaque appareil connecté, y compris tous les appareils pré-Lollipop. Je l'utilise sur mon serveur Jenkins juste avant d'exécuter des tests Android Android pour s'assurer que les appareils sont prêts à fonctionner. J'espère que quelqu'un trouvera cela utile!

#!/bin/sh

# Returns the power state of the screen 1 = on, 0 = off
getDisplayState() {
    state=$(adb -s $1 Shell dumpsys power | grep mScreenOn= | grep -oE '(true|false)')

    # If we didn't get anything it might be a pre-Lollipop device
    if [ "$state" = "" ]; then
        state=$(adb -s $1 Shell dumpsys power | grep 'Display Power' | grep -oE '(ON|OFF)')
    fi

    if [ "$state" = "ON" ] || [ "$state" = "true" ]; then
        return 1;
    else
        return 0;
    fi
}

echo "Turning on screen on all connected devices..."

for device in `adb devices | grep device$ | cut -f1`
do
    echo -n "Found device: $device ... "

    getDisplayState $device
    state=$?

    # If the display is off, turn it on
    if [ $state -eq 0 ]; then
        echo "display was off, turning on"
        adb -s $device Shell input keyevent 26
    else
        echo "display was on"
    fi

done
0
Victor Rendina