未来の自分へ知識谷金

ゆーきのエンジニアブログ
Pythonプログラミング

PythonでAndroidをリモート制御する【ADB】

ADBAndroidclassPythonアンドロイドクラスリモート制御自動化

今回はPythonからAndroid端末をリモートで制御する方法です。

adb.exeのパスを確認する

adb.exeでできること

adb.exeを使用するとコマンドライン上でコマンドを実行することでAndroidを操作できます。

ソースコード(クラス)

# -*- coding: Shift-JIS -*-
from enum import IntEnum
import subprocess
import os
import cv2
import time
import numpy as np

class AdbCtrl(object):

    class InitParam(object):
        def __init__(self) -> None:
            self.AdbRootDir: str = r""
            self.IsUseHdAdb: bool = False

    class Device(object):
        def __init__(self, deviceId: str = "", deviceName: str = "") -> None:
            self.DeviceId: str = deviceId
            self.DeviceName: str = deviceName

    class eKeyCode(IntEnum):
        Home = 3
        Back = 4
        Task = 187

    def __init__(self) -> None:
        self.initParam = AdbCtrl.InitParam()
        self.isInitialized = False

    def Initialize(self, param) -> None:
        if not os.path.isdir(param.AdbRootDir):
            raise Exception(f"ADBのフォルダパス({param.AdbRootDir})が不正です")
        self.initParam = param
        self.isInitialized = True

    def ExecTap(self, device, x: int, y: int) -> None:
        send = f"adb {self.GetOptionDeviceStr(device)}shell input touchscreen tap {int(x)} {int(y)}"
        self.NonQuery(send)

    def ExecSwipe(self, device, x1, y1, x2, y2, timeMs) -> None:
        send = f"adb {self.GetOptionDeviceStr(device)}shell input touchscreen swipe {x1} {y1} {x2} {y2} {timeMs}"
        self.NonQuery(send)

    def ExecScreenCap(self, device):
        send = f"adb {self.GetOptionDeviceStr(device)}exec-out screencap -p"
        png_bytes = self.QueryBin(send)
        return cv2.imdecode(np.frombuffer(png_bytes, np.uint8), cv2.IMREAD_COLOR)

    def GetOptionDeviceStr(self, device) -> str:
        if device is None:
            return ""
        return f"-s {device.DeviceId} "

使い方

self.adbCtrl = AdbCtrl()
initParam = AdbCtrl.InitParam()
initParam.AdbRootDir = self.appConfig.AdbRootDir
self.adbCtrl.Initialize(initParam)
self.adbCtrl.ExecTap(None, 100, 200)

最後に

実際にこのクラスを使用して、定型作業を自動化することもできます。

以上!