Android adb sendevent не выполняет события правильно - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь записать события экрана и выполнить их после для воспроизведения.

Я написал небольшой скрипт на python, который прослушивает события, преобразует их из шестнадцатеричного в десятичное, ждет в течение 5 секунд и выполняет записанные события сadb sendevent.

Но по какой-то причине sendevent никогда не выполняется правильно, иногда он касается неправильных координат, иногда касается слишком долго, также возникают проблемы с задержками между касаниями.

Я не мог понять, почему этоэто происходит ?Я ожидаю, что он должен просто воспроизвести, так как Getevent захватил все необходимые данные (?)

import subprocess
import threading
import os
from time import sleep

eventsToSend = []
def eventSender():
    while(True):
        if(len(eventsToSend) > 200):
            print("starting to execute in 5 seconds...")
            sleep(5)
            for command in eventsToSend:
                #with open('output.txt', 'a') as f1:
                    #f1.write(command+os.linesep)
                subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
            print("done")
            break




        else:
            None

eventSenderStarter = threading.Thread(target = eventSender)
eventSenderStarter.start()

def runProcess(exe):    
    p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while(True):
        # returns None while subprocess is running
        retcode = p.poll() 
        line = p.stdout.readline()
        yield line
        if retcode is not None or len(eventsToSend)>200:
            print("Executing events...")
            break

print("Listening for events...")

for line in runProcess('adb shell -- getevent  /dev/input/event1'.split()):
    myLine = line.decode().strip()
    splittedLine = myLine.split(" ")
    decimalString = ""
    for index,hexadecimal in enumerate(splittedLine):
        decimal = int(hexadecimal, 16)
        if(index==0):
            decimalString = decimalString+str(decimal)
        if(index>0):
            decimalString = decimalString+" "+str(decimal)

    eventsToSend.append("adb shell sendevent /dev/input/event1 "+decimalString)

Просто подключите свой телефон к ПК, а затем запустите этот сценарий воспроизведения с экрана после 200 событий, он начнет воспроизведение (будетосторожно, потому что это может привести к неправильным координатам: P). В моем случае это было

/dev/input/event1 

, поэтому вам может понадобиться отредактировать событие1 для тестирования.

1 Ответ

0 голосов
/ 21 сентября 2019

Попробуйте добавить небольшую задержку между отправляемыми вами событиями - time.sleep(0.5).Возможно, вам придется изменить значение 0,5 - попробуйте некоторые значения, пока он не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...