资讯专栏INFORMATION COLUMN

[Archer's Python Lab]jython+ddmlib 安卓屏幕截图并在we

Hujiawei / 1514人阅读

摘要:代码获取设备列表信息获取设备列表信息超时获取所有已连接设备根据获取单个当前设备不存在序号为的设备请检查连接获取当前屏幕图像的字节数据保存图像字节数据保存当前屏幕对象将当前屏幕图像数据保存为图片横屏尺寸处理发生异常为空

  

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

需求

之前一直在寻找一种完美的移动设备屏幕流回传方案,这种尝试一旦成功即可运用于多种平台,比如云端测试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:
t.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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37413.html

相关文章

  • Archer's Un*x Lab]Brew Python 与 Xcode Plugin

    摘要:通过安装的会提示移除自带的版本,除非你忽略这个,但同时又会带来一系列的安装问题,由于的某些默认会加载,故经常导致的不能启动问题可以尝试用一句话解决。查看出错信息首先通过安装接着直接,这个时候就可以成功了,顺利启动。 通过brew安装的python会提示移除mac os自带的python版本,除非你忽略这个warning,但同时又会带来一系列package的安装问题,由于xcode...

    Shonim 评论0 收藏0
  • Java之调用Python代码

    摘要:首先是直接通过调用代码。先写个代码文件,它位于盘中,其完整代码如下该代码接受两个命令行参数,然后输出一个乘法算式。   对于一个数据分析方面的工作者来说,最熟悉的语言无疑就是Python了。对于软件开发者而言,Java又是极其重要的工具。那么,一个很自然的问题就是,我们能够在Java中调用Python代码吗?  想要在Java中调用Python代码,有以下两个办法: 直接通过Runt...

    gghyoo 评论0 收藏0
  • Java之调用Python代码

    摘要:首先是直接通过调用代码。先写个代码文件,它位于盘中,其完整代码如下该代码接受两个命令行参数,然后输出一个乘法算式。   对于一个数据分析方面的工作者来说,最熟悉的语言无疑就是Python了。对于软件开发者而言,Java又是极其重要的工具。那么,一个很自然的问题就是,我们能够在Java中调用Python代码吗?  想要在Java中调用Python代码,有以下两个办法: 直接通过Runt...

    saucxs 评论0 收藏0
  • python 代码 打包成jar

    摘要:写东西快但是生态广比如大数据虽然好但是利用不到的整个的生态的代码虽然也好但是毕竟有些库需要自己写的多虽然也很简单但是查文档也很麻烦那么问题来了最简单的的方式就是直接把打包那么问题又来了打包成挺麻烦的官方文档看不懂答案有了写了个包搞这个事情 py 写东西快 但是java 生态广 比如大数据 py 虽然好 但是利用不到java的整个的生态的代码 scala 虽然也好但是毕竟 有些库 ...

    sugarmo 评论0 收藏0
  • python 代码 打包成jar

    摘要:写东西快但是生态广比如大数据虽然好但是利用不到的整个的生态的代码虽然也好但是毕竟有些库需要自己写的多虽然也很简单但是查文档也很麻烦那么问题来了最简单的的方式就是直接把打包那么问题又来了打包成挺麻烦的官方文档看不懂答案有了写了个包搞这个事情 py 写东西快 但是java 生态广 比如大数据 py 虽然好 但是利用不到java的整个的生态的代码 scala 虽然也好但是毕竟 有些库 ...

    freecode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<