[Archer's Python Lab]jython+ddmlib 安卓屏幕截图并在web展示demo
admin
2023-07-31 01:50:11
0

部分代码思路来源于互联网

需求

之前一直在寻找一种完美的移动设备屏幕流回传方案,这种尝试一旦成功即可运用于多种平台,比如云端测试Portal中对机器设备屏幕的实时监控,再辅以html5强大的特性,可以直接在web上模拟手机操作,达到\”远程监控\”的目的,本demo的部分思路来源于互联网,我尝试用jython全部重写了一遍,这种方式实现起来虽然比较\”土鳖\”,但是效果基本可以符合需求,下面是效果图和代码清单。

代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Android_ScreenSream by Archer
# Based on Jython,ddmlib

#import jar
import sys,os
sys.path.append(r\'C:\\\\ddmlib.jar\')
sys.path.append(r\'C:\\\\guava17.jar\')
sys.path.append(r\'C:\\\\rt.jar\')
from threading import Thread

#import lib
from java.awt.image import *
from java.io import *
from javax.imageio import *
from com.android.ddmlib import *
from time import sleep

class AndroidScreenStream(object):

    def __init__(self):
        super(AndroidScreenStream,self).__init__()
        self.devices=[]
        self.currentdevice=None
        self.rawimgdata=None
        self.rawscreen=None

    def wait_device_lists(self,bridge):
        \"\"\"获取设备列表信息\"\"\"
        count=0
        while(bridge.hasInitialDeviceList()==False):
            try:
                sleep(0.5)
                count+=1
            except:
                pass
            if(count>60):
                print \"获取设备列表信息超时!\"
                break

    def get_devices(self):
        \"\"\"获取所有已连接设备\"\"\"
        AndroidDebugBridge.init(False)
        mybridge=AndroidDebugBridge.createBridge()
        self.wait_device_lists(mybridge) #get
        self.devices.append(mybridge.getDevices())
        return self

    def get_device_by_index(self,index):
        \"\"\"根据index获取单个当前设备\"\"\"
        AndroidDebugBridge.init(False)
        mybridge=AndroidDebugBridge.createBridge()
        self.wait_device_lists(mybridge) #get
        try:
            self.currentdevice=mybridge.getDevices()[index]
            return self
        except IndexError:
            print \"不存在序号为\"+str(index)+\"的设备,请检查USB连接!\"
            sys.exit()

    def get_current_screen_imgbyes(self):
        \"\"\"获取当前屏幕图像的字节数据\"\"\"
        self.rawimgdata=self.currentdevice.getScreenshot().data #保存图像字节数据
        return self

    def get_current_rawscreen(self):
        \"\"\"保存当前屏幕screen对象\"\"\"
        self.rawscreen=self.currentdevice.getScreenshot()
        return self

    def save_screen_img(self,path=os.path.join(os.getcwd(),\'current_frame.jpeg\'),islandscape=False):
        \"\"\"将当前屏幕图像数据保存为图片\"\"\"
        if self.rawscreen is not None:
            landscape=islandscape
            #横屏尺寸处理
            imgwidth=self.rawscreen.height if landscape else self.rawscreen.width
            imgheight=self.rawscreen.width if landscape else self.rawscreen.height
            image=BufferedImage(imgwidth,imgheight,BufferedImage.TYPE_INT_RGB)
            if image.getHeight()!=imgheight or image.getWidth()!=imgwidth:
                image=BufferedImage(imgwidth,imgheight,BufferedImage.TYPE_INT_RGB)
            index=0
            indexInc=self.rawscreen.bpp>>3
            for y in range(self.rawscreen.height):
                for x in range(self.rawscreen.width):
                    value=self.rawscreen.getARGB(index)
                    if landscape:
                        image.setRGB(y,self.rawscreen.width-x-1,value)
                    else:
                        image.setRGB(x,y,value)
                    index+=indexInc
            try:
                ImageIO.write(image,\"JPEG\",File(path))
            except IOError:
                print \"发生异常!\"
                sys.exit()
        else:
            print \"rawscreen为空!\"
            sys.exit()

if __name__==\"__main__\":
    ASS=AndroidScreenStream()
    ShotDevice=ASS.get_device_by_index(0)
    while True:
        ShotDevice.get_current_rawscreen().save_screen_img()

Github

Android_Screen_Stream

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...